1.typeof
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
但是 instanceof 可以将数组区分出来
:
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
2.null
和undefined
是==
关系,但是null
可以理解为空值,undefined
理解为未定义.
3.null
可以转换成0
,而undefined
就不行
Number(null) // 0
5 + null // 5
Number(undefined) // NaN
5 + undefined // NaN
4.布尔值转换时,除了undefined
,null
,false
,0
,NaN
,""(空字符串)
,''(空字符串)
会表示为false
,其他都是true
.
是的,空数组([]
),空对象({}
)都是true
.
5.js 中都是浮点数,不会很精确,所以计算时会出现下面的情况,小数计算尤其要注意
(0.3 - 0.2) === (0.2 - 0.1)
// false
5.js 浮点数在-253~253之间都可以精确表示,超过这个范围就开始智障.
math.pow(2,53)
//即2^53=9007199254740992
math.pow(2,53)-1
//9007199254740991
但是
math.pow(2,53)+1
//9007199254740992,而不是9007199254740993
//因为超出范围了
Math.pow(2, 53) + 2
// 9007199254740994
Math.pow(2, 53) + 3
// 9007199254740996
Math.pow(2, 53) + 4
// 9007199254740996
Math.pow(2, 53)
// 9007199254740992
// 多出的三个有效数字,将无法保存
9007199254740992111
// 9007199254740992000
如果一个数大于等于了2^1024,则会正向溢出.
Math.pow(2, 1024) // Infinity
如果一个数小于等于2^(-1024),则会负向溢出.
Math.pow(2, -1075) // 0
6.正零和负零
-0 === +0 // true
0 === -0 // true
0 === +0 // true
+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'
(1 / +0) === (1 / -0) // false
7.NaN
5 - 'x' // NaN
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0 / 0 // NaN
但是
typeof NaN // 'number'
NaN === NaN // false
8.infinity
// 场景一
Math.pow(2, 1024)
// Infinity
// 场景二
0 / 0 // NaN
1 / 0 // Infinity
//四则运算
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity
Infinity - Infinity // NaN
Infinity / Infinity // NaN
null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity
undefined + Infinity // NaN
undefined - Infinity // NaN
undefined * Infinity // NaN
undefined / Infinity // NaN
Infinity / undefined // NaN
Infinity
大于一切数值(除了NaN
),-Infinity
小于一切数值(除了NaN
)。Infinity
与NaN
比较,总是返回false。
Infinity > 1000 // true
-Infinity < -1000 // true
9.parseInt()
将字符串
转换成整数.
parseInt(' 81') // 81,自动去除空格
parseInt(1.23) // 1,这里面是数值,会先转换成字符串,再转换成整数
10.字符串可以用单引号或双引号'abc'
或"abc"
,单引号字符串内部可用双引号,双引号字符串内部可用单引号.
单引号字符串内加单引号需要用到转义的反斜杠\
如'Did she say \'Hello\'?'
html 属性用双引号, js 字符串用单引号.
字符串只能写在一行内,中间换行会报错:// SyntaxError: Unexpected token ILLEGAL
如果必须分行,则每行末尾需加上\
.
var longString = 'Long \
long \
long \
string';
longString
// "Long long long string"
或者用+
拆一个长字符串为多个单行字符串.
var longString = 'Long '
+ 'long '
+ 'long '
+ 'string';
11.转义,以下是常见的,还有些数字的转义,看着头大,决定不管了
\0
:null(\u0000
)
\b
:后退键(\u0008
)
\f
:换页符(\u000C
)
\n
:换行符(\u000A
)
\r
:回车键(\u000D
)
\t
:制表符(\u0009
)
\v
:垂直制表符(\u000B
)
\'
:单引号(\u0027
)
\"
:双引号(\u0022
)
\\
:反斜杠(\u005C
)
在非特殊字符前面用\
则\
会被忽略,如'\a'
会变成"a"
12.字符串可视为数组
var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o"
// 直接对字符串使用方括号运算符
'hello'[1] // "e"
但是,字符串与数组的相似性仅此而已。实际上,无法改变字符串之中的单个字符。
var s = 'hello';
delete s[0];
s // "hello"
s[1] = 'a';
s // "hello"
s[5] = '!';
s // "hello"
13.对象[对象就是一组'键值对(key-value)'
的集合]
var obj = { //obj 是对象
foo: 'Hello', //foo 是键名,字符串是键值
bar: 'World'
};
键名
可以是数值,但是数值会被自动转成字符串.
var obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
obj['100'] // true
如果是不符合明明规定的名称,则需要加上引号
// 报错
var obj = {
1p: 'Hello World'
};
// 不报错
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};
键名也叫属性,如果属性的值为函数,则这个属性被称为方法
.属性之间可以用逗号隔开
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
14.属性读取的两种格式
var obj = {
p: 'Hello World'
};
obj.p // "Hello World"
obj['p'] // "Hello World",必须加引号,不然会被当做变量
网友评论