-
标识符
字母$下划线,非首字符还可以是数字 -
注释
//
/*
*
*/
-
严格模式
“use strict”;
报错行为:
省略var初始化变量
定义名为eval或arguments的变量
不能使用数字的八进制字面量
函数的形参不能有两个同名参数,参数和函数名不能为eval或者arguments
修改arguments值会报错 -
省略var初始化变量会定义为全局变量,不推荐
-
基本数据类型,简单数据类型
Undefined Null Boolean Number String -
复杂数据类型
Object -
typeof运算符
String “string”
Number “number”
Boolean “boolean”
Undefined “undefined”
Null或对象 “object”
函数 “function” -
Undefined类型
使用未声明变量会报错
变量不初始化的时默认值是undefined
typeof操作未声明或未初始化变量都返回undefined -
NUll类型
null == undefined //true -
Boolean类型
其他类型转布尔用Boolean()方法
String 非空为true,空为false
Number 非零和无穷大为true,0和NaN为false
Object 任何对象为true,null为false
undefined为false -
Number类型
默认十进制,0开头且在0到7之间解析为八进制,0x开头且在0-9,a-f或A-F为十六进制
算术计算会把八进制和十六进制转换成十进制
浮点
.1 1. 都是有效的浮点,虽然不推荐
科学计数法使用e后面的数字表示10的指数次幂
浮点最高精度是17位小数
浮点不能做相等测试,0.1+0.2的结果大于0.3
数字范围
数值范围是Number.MIN_VALUE到Number.MAX_VALUE
isFinite() 检查数字是否在范围内
超出范围自动转为特殊的无穷值
NaN
任何数除以0返回NaN
设计NaN的操作都会返回NaN
NaN跟任何值都不相等,包括NaN本身
isNaN()检查不是数值
字符串,NaN和非数字字符串(“10x”)返回true(parseInt(“10x”)返回10)
数值、数值字符串"10"和布尔(true,false)返回false
Number()函数
true和false转为1和0
null返回0
undefined返回NaN
字符串:
不能转0开头的八进制
0x开头的十六进制转为十进制
空字符串转为0
对象:
调用其valueOf()方法按照基本类型转换
如上述返回值为NaN则调用toString()方法按照基本变量类型转换
parseInt()函数
忽略空格找到第一个非空格字符,如果不是数字字符或者负号返回NaN,如果是数字字符则继续解析或者遇到非数字字符
ES5直接支持十六进制字面量字符串,不直接支持八进制
可以通过第二个参数传2、8或16解析二进制、八进制或十六进制
parseFloat()函数
只接受第一个小数点
十六进制格式字符串转为0
不接受第二个参数
如果可以解析为整数则返回整数,用Number.isInteger证实是整数
- String类型
length属性返回字符个数
单引号或双引号不能混用
字面量:
\n换行 \t \b \r \f \ ’ "
\xnn \x41表示"A"
\unnnn \4e00 表示汉字
输出所有汉字:
parseInt(“4E00”, 16 ) // 19968
parseInt( ‘9FA5’, 16) // 40869
unescape("%u" + n.toString( 16 ))
字符串是不可变的,修改字符串时会销毁原来的字符串
IE6字符串拼接速度很慢,但是新版浏览器都解决了
其他类型转字符串
toString()方法,但是null和undefined没有,
接受参数为2到36在谷歌浏览器试出来的
String()接受null和undefined返回"null"和"undefined",对象则调用toString方法
- Object类型
new Object() 或者 new Object,或者不推荐
实例属性:
constructor 指向构造函数
hasOwnProperty(propName)检查是否为对象属性而不是原型属性
isPrototypeof(object)检查是否是一个对象的原型
propertyIsEnumerable(propName)检查能否用for-in遍历
toLocalString()本地化字符串表示
toString()返回对象的字符串表示
valueOf()返回对象的字符串数字或者布尔表示
BOM对象和DOM对象是宿主对象不一定继承了Object,不确定
-
递增和递减
在表达式中使用时,前置先递增递减后取值,后置先取值再递增递减
非数值会转为数值再递增 -
一元加和减
非数值类型会被转为数值类型 -
位操作
ES5存储使用64位,操作时会转为32位结束后转为64位存储,导致NaN和Infinity用位操作会当做0处理
对开发人员,就像是只有32位的整数
第一位是符号位1表示负数0表示整数
负数的二进制码:绝对值的二进制码,反码,加一
18使用toString(2)时返回"10010",-18是"-10010",说明转换过程理解了二进制补码展示得更有逻辑
非数值用位操作符会自动用Number()函数转化为数值
按位非:波浪线~ ,取补码,本质是操作数的复制减1
按位与:和号字符&,都是1得到1否则为0,本质是把每一位对齐
按位或:竖线符号|,至少有一个1就得到1否则为0
按位异或:插入符号^,有且只有一个1就得到1否则为0,不同为1相同为0
左移: 两个小于号<<,保留符号位向左移动
有符号右移:两个大于号>>,保留符号位向右移动
无符号右移:三个大于号>>>,不保留符号位向右移动
-
布尔运算符 与或非
非布尔类型会转为布尔类型 -
加减乘除运算符
非数值类型会自动调用Number()转为数值类型 -
大于,小于,不大于,不小于
如果有非数值和数值比较会自动调用Number()转为数值类型 -
相等运算符
比较字符串数值布尔比较简单
相等运算符会对不同类型的基本数据类型进行强制转换
全等运算符不会进行转换 -
switch语句
可以使用任何数据类型来决定case执行
case甚至可以是变量甚至表达式
表达式:
switch(true) {
case expression1
[code]
break;
case expression1
[code]
break;
default:
[code]
}
- 函数
函数中arguments数组存放参数,长度是根据传入元素个数计算的,命名参数是可选的
赋值给arguments的元素会修改参数,修改参数不会改变arguments的元素
严格模式修改arguments值会报错
函数没有重载,使用arguments是一种替代方式