1.type 属性: 默认的 type 就是 javascript, 因此没必要显式指定 type 为 javascript。
2.javascript 不强制在每一个语句结尾加 “;” , javascript 会自动加分号, 可是在某些状况下会改变程序的语义, 因此最好主动加 “;”。
3.两个相等运算符比较javascript
‘==’ 相等( 值相等 ), 它会自动转换数据类型再比较, 不少时候会获得很是诡异的结果java
‘===’ 严格相等( 数据类型和值都相等 ) , 它不会自动转换数据类型, 若是数据类型不一致, 返回false, 若是一致, 再比较
4.NaN 与全部其余值都不相等, 包括它本身:数组
NaN === NaN; // falseapp
惟一能判断 NaN 的方法是经过 isNaN() 函数函数
isNaN(NaN); // true
5.浮点数比较this
浮点数在运算过程当中会产生偏差, 由于计算机没法精确表示无限循环小数。 要比较两个浮点数是否相等, 只能计算它们之差的绝对值, 看是否小于某个阈值:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
6.null 和 undefinedprototype
大多数状况下,咱们都应该用 null , undefined 仅仅在判断函数参数是否传递的状况下有用
7.出于代码的可读性考虑,建立数组建议使用 '[ ]',而不使用 'new Array';
8.若是一个变量没有经过 'var' 声明就被使用,那么该变量就自动被声明为全局变量。使用 var 声明的变量则不是全局变量,它的范围就该被限制在该变量被声明的函数体内
9.启用 strict 模式(强制经过 var 声明变量)
10.多行字符串用反引号表示
11.使用模版字符串
12.要获取字符串某个指定位置的字符,使用相似 Array 的下标操做, 索引号从 0 开始。 字符串是不可变的, 若是对字符串的某个索引赋值, 不会有任何错误,可是也没有任何效果
13.直接给 Array 的 length 赋一个新的值会致使 Array 大小的变化
14.若是经过索引赋值时, 索引超过了范围, 一样会引发 Array
大小的变化, 可是不会有任何错误, 在编写代码时, 不建议直接修改 Array
的大小, 访问索引时要确保索引不会越界
15.数字 1 和字符串 '1' 是不一样的元素
16.slice() 的起止参数包括开始索引, 不包括结束索引。
17.若是不给 slice() 传递任何参数, 它就会从头至尾截取全部元素。 利用这一点, 咱们能够很容易地复制一个 Array
18.空数组继续 pop
不会报错,而是返回 undefined
19.concat()
方法并无修改当前 Array
, 而是返回了一个新的 Array
,concat()
方法能够接收任意个元素和 Array
, 而且自动把 Array
拆开, 而后所有添加到新的 Array
里
20.javascript
对象属性名必须是一个有效的变量名。 若是属性名包含特殊字符, 就必须用 ''
括起来
21.若是咱们要检测 xiaoming
是否拥有某一属性, 能够用in操做符, 不过要当心, 若是 in
判断一个属性存在, 这个属性不必定是xiaoming
的, 它多是 xiaoming
继承获得的
22.要判断一个属性是不是 xiaoming
自身拥有的,而不是继承获得的,能够用 hasOwnProperty()
方法
23.JavaScript把 null
、undefined
、0
、NaN
和空字符串 ''
视为 false
,其余值一律视为 true
24.因为 Array
也是对象, 而它的每一个元素的索引被视为对象的属性, 所以, for ... in
循环能够直接循环出 Array
的索引
25.for ... in 循环因为历史遗留问题, 它遍历的其实是对象的属性名称,
for ... of` 循环则彻底修复了这些问题, 它只循环集合自己的元素code
1.函数若是没有 return
语句, 函数执行完毕后也会返回结果, 只是结果为 undefined
2.因为 JavaScript
容许传入任意个参数而不影响调用, 所以传入的参数比定义的参数多也没有问题, 虽然函数内部并不须要这些参数, 传入的参数比定义的少也没有问题
3.关键字 arguments
相似 Array
但它不是一个 Array
4.不在任何函数内定义的变量就具备全局做用域。 实际上, JavaScript
默认有一个全局对象 window
。 以变量方式 var foo = function () {}
定义的函数实际上也是一个全局变量。
5.用 var that = this;
, 你就能够放心地在方法内部定义其余函数,而不是把全部语句都堆到一个方法中。 对于普通函数调用, 一般把 this
绑定为 null
。
6.apply()
与 call()
的惟一区别对象
apply()
把参数打包成 Array
再传入;call()
把参数按顺序传入。7.全部实例的原型引用的是函数的 prototype 属性
8.箭头函数内部的 this
是词法做用域( 写代码或者定义时肯定的 做用域,动态做用域是在运行时肯定 ),由上下文肯定。箭头函数彻底修复了 this
的指向,this
老是指向词法做用域继承
1.若是咱们在使用 Number
、Boolean
和 String
时, 没有写 new
,Number()
、Boolean()
和 String()
被当作普通函数,把任何类型的数据转换为 number
、boolean
和 string
类型(注意不是其包装类型)
2.不要使用 new Number()
、new Boolean()
、new String()
建立包装对象;
3.用 parseInt()
或 parseFloat()
来转换任意类型到 number
;
4.用 String()
来转换任意类型到 string
,或者直接调用某个对象的 toString()
方法;
5.一般没必要把任意类型转换为 boolean
再判断,由于能够直接写 if (myVar) {...}
;
6.typeof
操做符能够判断出 number
、boolean
、string
、function
和 undefined
;
7.判断 Array
要使用 Array.isArray(arr)
;
8.判断 null
请使用 myVar === null
;
9.判断某个全局变量是否存在用 typeof window.myVar === 'undefined'
;
10.函数内部判断某个变量是否存在用 typeof myVar === 'undefined'
。
11.任何对象都有 toString()
方法吗? null
和 undefined
就没有!
12.number
对象调用 toString()
报 SyntaxError