1.数字
1.1 整型直接量
(1)不区分整数值与浮点数值,所有数字均用浮点数值表示。
(2)能识别十六进制(0xff=256)
(3)某些实现允许采用八进制(0377=255)。ES6中,八进制严格禁止。
1.2 浮点型直接量
(1)表示方法:1.1或6.02e23(6.02x10的23次方)
1.3 算术运算
(1)+-*/四则运算以及Math对象中提供的各类运算函数
(2)溢出时结果为无穷大值,以Infinity表示
(3)下溢,指运算结果无限接近于0且比能表示的最小值还小的情况,此时将会返回0,负数发生下溢时将会返回负零。
(4)除以0不报错,返回无穷大,除非是0除以0,此时将返回NaN。
(5)0除以0,给负数开方,无穷大除以无穷大,运算符或者操作数不是数字时返回NaN(Not a Number)。NaN与任何值都不相等,
(NaN===NaN)=false。
因此判断时采用isNaN函数。
(6)
(7)采用IEEE-754浮点法表示浮点数,因此不能精确表示小数。
((0.3-0.2)==(0.2-0.1))=false;
2. 文本
2.1 字符串直接量
(1)JavaScript中没有字符型(char),单个字符也是表示为长度为1的字符串。
(2)可拆分成若干行,每行以\结束,另开一行必须使用\n转义字符。
2.2 转义字符
代码 | 输出 |
---|---|
\’ | 单引号 |
\” | 双引号 |
\& | 和号 |
\ | 反斜杠 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\b | 退格符 |
\f | 换页符 |
2.3 字符串的使用
(1)字符串的连接使用+
(2)字符串是固定不变的,对字符串进行处理的函数都返回新字符串
(3)模式匹配:正则表达式
3. 布尔值
(1)只有true与false两个值
(2)任何值都可以转换为布尔值,以下值会转换为false:
- undefined
- null
- 0
- -0
- NaN
- “”(空字符串)
4. 全局对象
- 全局属性:undefined,Infinity,NaN
- 全局函数:isNaN,parseInt,eval
- 构造函数:Date,RegExp,String,Object,Array
- 全局对象:Math,JSON
客户端JavaScript中,浏览器窗口的JavaScript代码中,Window对象充当全局对象。
5. 对象包装
var s="hello";
var len=s.length();
当调用字符串s的length方法时,JavaScript会临时调用new String(s)将s转换为对象,因此拥有字符串的各类方法,一旦引用结束,临时创建的对象销毁。
6. 不可变与可变
JavaScript中的原始值(undefined,null,布尔值,数字,字符串)是无法改变的。
字符串可能看起来不太好理解,当改变字符串值时
var s="hello";
s.toUpperCase();
s是不变的,toUpperCase方法只是返回了一个新的字符串。
而对于对象来说则灵活得多,因为他们的值时可修改的。但对象的比较是针对引用类型的比较——当且仅当两个对象引用同一基对象时它们才相等。
var a=[];
var b=a;
b[0]=1; //a也跟着改变
a===b; //true,因为引用同一数组
因此比较两个对象最好使用自定义的equals方法。
7. 类型转换
7.1 对象的转换
(1)对象到布尔值:所有的对象都转换为true
(2)对象到字符串和数字:根据各自的方法转换
例如:
[1,2,3].toString(); \\1,2,3
(function(x){}).toString() \\function(x){}
(3)
对象转换为字符串过程:
- 调用toString方法返回一个原始值,将原始值转换为字符串,并返回字符串结果
啥都没有就抛出一个类型错误异常
对象转换为数字过程:
否则调用toString方法,返回原始值并转换为数字返回
否则就抛出一个类型错误异常
8. 变量作用域
变量分两种:全局变量和局部变量
a=1; //全局变量声明可以不写var语句
function f(){
var a=2;
return a; //返回值为2
} //全局变量会在函数体内被局部变量覆盖
对上述代码做一些小调整:
var a=1
function f(){
a=2;
return a; //对全局变量进行了修改
}
由此看来,局部变量声明时必须使用var语句,否则有可能影响到全局变量
function f(){
var i=1;
for(var j=0;j<10;j++)
{
console.log(j)
}
console.log(j); //j已定义,输出10
}
JavaScript内没有块级作用域,使用的是函数作用域:变量在声明的函数体以及函数体嵌套的任意其他函数体内都是有定义的
var a=1;
function f(){
console.log(a); //输出"undefined"
var a=2;
}
声明提前至函数体顶部,但初始化及赋值位置不变。
9. 作用域链
参见作用域链