1.HTML中设置事件处理程序,可以写成onClick,但在JavaScript中必须是小写。原因是HTML不区分大小写,JS区分大小写。

2.在JavaScript中,只有null和undefined是无法拥有方法的值。

3.JS的所有数字都是用浮点数值表示。采用的是IEEE 754标准定义的64位浮点数表示法。这是一种二进制表示法,可以精确的表示分数1/2,1/4,1/8等,但是无法精确表示1/10,1/100等数字。所以才会有

0.1+0.2=0.30000000000000004

4.0/0 计算结果是NaN。

5.NaN和任何值都不等。

6.其他类型转换成布尔类型时

undefined
null
NaN
+0
-0
“”

以上值转成false,其他均转为true。

7.用var声明全局变量,变量会成为全局对象的属性。ES6中的let和const声明的全局变量不会成为全局对象的属性。Node中,var声明的变量也不会成为全局变量的属性。

8.null,undefined没有包装对象,访问他们的属性会造成类型错误。

9.基本类型值比较是值比较,引用类型是引用比较。
比如:

1
2
3
4
5
6
7
8
const  a = 2, b = 2;
a === b; //true
const c = [1, 2], d = [1, 2];
c === d; //false
const p = { name: 'yejia' }, h = { name: 'yejia' };
p === h; //false
const j = p;
p === j; //true

为什么会这样?这得要理解JS中变量和值的存储原理。

基本类型中,是直接把值赋给变量,我们就可以用变量来代表值做各种运算。

而引用类型中,对象是存储在对内存中的。计算机通过地址访问堆内存中的对象。所以我们要知道地址,我们就把地址赋给变量。所以,我们用的变量里存储的是指向对象的地址而已。所以引用类型的比较就是地址(引用比较)。上述例子中,数组c和d看起来是一样,但只是数组里的基本类型值一样而已,他们的地址(引用)是不同的,所以不等。

10.区分==和===

“==”运算符在进行比较时,会转换类型,再比较,所以不能说两个值相等。在编程时,要判断两个值是否相等要用严格相对运算符“===”。
比如:

1
'11' == 11;      //字符串'11'会转换成11,然后再比较。

11.对象转换为基本类型值(原始值)
在类型换行中,对象转换成基本类型值是最复杂的。
A.对象转换成布尔值,所有都是true;
B.对象转成字符串或者数字会调用对象的toSring()和valueOf()方法。

对象转成字符串的过程:

如果对象有toString()方法,调用它。如果能返回原始值,返回这个值得字符串。
如果没有toString()方法,或者调用了也无法返回原始值。调用valueOf()方法。
两个方法都无法获得原始值,抛出错误。

对象转成数字的过程:

与转成字符串类似。不过是先调用valueOf()方法。

#####toString()

toString():
这个方法会返回对象的字符串。但是,字符串是什么字符串请看下面第一个例子。

1
({x:1, y:2}).toString()   // =>"[object object]"

还有,这是上述是对象继承自object的toString方法。很多类都自己定义有toString方法。其中数组类的toString方法:

1
[1, 2, 3].toString() // => "1,2,3"

函数是直接返回函数代码字符串:

1
2
3
4
5
6
(function add(a, b) {
return a + b;
}).toString()
/* => "function add(a, b) {
* return a + b;
* }"*/

正则表达式返回正则表达式字面量字符串。

日期类(Date)返回一个可读的时间和日期。

#####valueOf

valueOf()对于原始值,直接返回原始值。对于复杂类型值,简单的返回对象本身。数组,函数,正则表达式,对象都是这样。Date实例实现了valueOf,会返回一个自1970年1月1日以来的毫秒数。

12.var声明是可以重复的,没有赋值的重复声明会被忽略。赋值的,则该值会覆盖前面的值。let和const不能重复声明。

13.var声明的全局对象属性,是不可配置的。[[configurable]]的值是false,无法用delete删除属性。window.a这样声明的可以配置。

14.var声明的变量,函数都会在预编译时声明,提到该作用域前面。这是声明提升。let,const不会发生声明提升。会有暂时性死区(TDZ),声明前不能用。