1.JS有两种数据类型:
原始(基本)类型(primitive type)数字 字符串 布尔值 null undefined
对象类型(object type)
JS中不管是整数还是浮点数 都是数字这种类型 且都用浮点表示
数组 函数在JS中都属于特殊的对象 拥有他们专用语法
2.JS在发生溢出 下溢 被零整除时不会报错
溢出(overflow) 即正数或负数超出JS能表示的最大最小值 最终计算结果用Infinity
或-Infinity
表示
下溢(underflow)当一个数无限接近于0又超出JS能表示的范围的时候 会发生下溢 此时最终计算结果用0表示
被零整除 运算结果返回Infinity
或者-Infinity
当零除以零的时候 返回NaN
表示非数字值
使用isNaN()
函数或者 x!=x
来判断一个值是否为非数字 因为NaN
和任何值包括自己都不相等
3.字符串常用方法
s = 'Hello,world'
s.charAt(0) //=>H
s.subString(1,4) //=>ell(不包含索引为4的字符)
s.slice(1,4) //=>ell(效果同上)
s.slice(-3) //=>rld(类似于python 返回最后三个字符)
s.indexOf('l') //=>2 字符l首次出现的索引
s.lastIndexOf('l') //=>10 不解释了
s.split(',') //=>['Hello', 'world'] 分割字符串 返回数字
s.replace('H', 'h') //=>hello,world 全文字符替换
4.以下值在JS中会被视为false
称为假值
undefined
null
''
NaN
0
-0
5.字符串和数字、布尔值并不是对象 但是却可以调用诸如toString()
这样的方法
这实际上是通过包装对象new String()
等来创建一个临时对象实现的 在方法调用结束后临时对象会被销毁
包装对象和基本类型用==
运算符会返回true
但是===
会返回false
6.利用Number()
、Boolean()
、String()
、Object()
函数可以进行显式的类型转换(不含new)
也可以用运算符来进行隐式类型转换:
x + '' //=>转换成字符串
+x //=>转换为数字
!!x //=>转换为布尔值
7.JS使用函数作用域
变量在声明它们的函数体以及整个函数体嵌套的任意函数体内都是有定义的
也就是说 只要函数体内有这个变量 我就可以在函数体的任意位置使用它 变量在声明之前甚至已经可用
这特性被非正式的成为声明提前
var scope = 'global';
function f() {
console.log(scope);// 输出'undefined' 而不是'global'
var scope = 'local';
console.log(scope);// 输出'local'
}
8.===
严格相等运算符
比较过程中没有类型转换 注意以下特殊情况:
NaN
和任何值包括自己不相等 所以 NaN === NaN 返回false
如果两个值都是null
或者 undefined
则返回false
9.&&
和 ||
称为逻辑与和逻辑或
他们都拥有返回值(真值或者假值)
返回的值取决于其“短路“行为
例如对于逻辑与&&
如果左边的表达式为假值 则直接返回左边表达式的计算结果 如果左边为真值 那么返回右边表达式的结果
有时候会使用这种行为来做一些特殊的操作 例如:
if (a == b) stop();
(a == b) && stop();// 和上面相同
逻辑非没有这种特性 它只会返回true
或者false
10.关于eval()函数
它接受一个参数 如果参数不是字符串 则直接返回这个参数
如果是字符串 则把其当成JS代码进行编译 如果编译失败则抛出一个语法错误异常 否则开始执行这段代码
并返回最后一个表达式或语句的值 如果没有值则返回undefined
用eval()
执行的代码 会使用调用它的变量环境作用域
如果执行eval()
函数有一个局部变量x
那么eval('x = 2')
会改变这个局部变量的值
当给eval()
函数赋予别名 并用别名调用时 会使用全局对象作为其上下文作用域 并且无法读、写、定义局部变量和函数
var geval = eval;
var x = 'global';
function f(){
x = 'local';
geval('x += "changed"');
return x;
}
console.log(f(), x); //local globalchanged