不少朋友在学习之初都感觉到了JS的灵活强大,可是也发现了一些蹩脚的语法,在使用时咱们如履薄冰面试
以前个人想法是把它们牢记,以便使用时知道如何避坑,而且它们还可能会在面试中被问到闭包
这两天翻看了《JavaScript语言精粹》这本书,让我换了一种思路——既然是蹩脚的语法,那就尽可能避开它们函数
本文将选取一些常见的坑坑语法进行讨论学习
当一个程序变得庞大时,全局变量将变得难以维护,由于全部做用域均可以改变它们,所以容易形成全局污染ui
建立全局变量的方式有三种:spa
- 在函数外使用var建立变量
- 添加属性到window对象,如 window.key = value
- 不使用var建立变量(隐式全局变量),如 a = 1
如何将全局变量的影响最小化?prototype
- 只定义一个全局变量,将其余变量都归于其下
var App = {}
App.person = {
name: "一灯",
age: 23
}
App.car = {
color: "red",
name: "桑塔拉"
}
复制代码
- 经过闭包
ES6以前只有var关键字定义变量,是没有块级做用域的。ES6出现后诞生了let和const解救了这个问题code
JavaScript会自动插入分号修正缺损的代码,但有时候会出现意外的“惊喜”对象
return
{
name: "一灯"
}
//以上代码本意是要返回一个对象,然而JS处理事后是这样:
//直接结束,没有返回对象
return;
{
name: "一灯"
};
//所以使用return时,不要单独一行写return
return {
name: "一灯"
}
复制代码
保留字不能用来命令变量、参数,但可用来命名对象的键值,只是必须用引号括起来,而且不可用“点表示法”访问,而可用“[]表示法”访问ip
var object = {
class: "AAA", //非法,但在火狐下又是合法
'class': "AAA" //合法
}
object.class = "BBB" //非法
object['class'] = "BBB" //合法
复制代码
这是什么玩意儿,咱不用了不用了好不!
typeof是用于检测变量类型的运算符,然而它的做用很是有限
typeof能准确检测的类型以下:
- string
- number
- boolean
- function
这里推荐一种类型检测比较全面的方法:
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(88) ; // [object Number]
Object.prototype.toString.call(true) ;// [object Boolean]
Object.prototype.toString.call(Symbol());//[object Symbol]
Object.prototype.toString.call(undefined) ;// [object Undefined]
Object.prototype.toString.call(null) ;// [object Null]
Object.prototype.toString.call(new Function()) ;// [object Function]
Object.prototype.toString.call(new Date()) ;// [object Date]
Object.prototype.toString.call([]) ;// [object Array]
Object.prototype.toString.call(new RegExp()) ;// [object RegExp]
Object.prototype.toString.call(new Error()) ;// [object Error]
Object.prototype.toString.call(document) ;// [object HTMLDocument]
Object.prototype.toString.call(window) ;//[object global]
复制代码
+ 不只是加号,也是链接符。除非两边的运算数都是数字,不然会看成链接符,结果变成字符串
所以作加法运算必定确保两边的是数字类型,尤为JS是弱类型语言
这里补充一点,其实对于减号,会更加复杂繁琐(不了不了伤身体.jpg),最好也确保两边的是数字类型
想起了被小学数学老师看到会打死的 0.1+0.2 不等于 0.3
咱们都知道二进制浮点数没法精确运算十进制小数,所以避免直接运算小数
先将小数放大为整数再运算(整数运算是精确的),运算完再转换为小数
JS中不少值都被定义为假,然而它们相互之间是不能互换的
- false
- 0
- NaN
- 空串
- null
- undefined
var object = {
name: "一灯"
}
if(object.age == null) {
console.log("没找到此属性")
}
//上面代码中,若是age属性不存在,应该使用undefined判断
//即便使用null没有出现问题,但有些状况下会带给你意外“惊喜”
复制代码
关于JS那些蹩脚的语法本文列举不全,欢迎在下方评论列出你认为值得注意反思的语法