说明:这是重读红宝书的读书笔记系列 ( 一 ),如有错误,欢迎指正!
一.js简介
- js组成
ECMAScript,提供核心语言功能
DOM,提供访问和操作网页内容的方法和接口
BOM,提供与浏览器交互的方法和接口 - 使用方法
使用script标签在html中嵌入js代码或导入外部.js文件,其中可以把script放在head标签中,也可以把script标签放在body标签内容后面。推荐第二种使用方法,因为前者要等到head元素中全部js代码都被下载和执行完成以后,才开始呈现页面内容,会导致浏览器在呈现页面时出现延迟
二.基本概念及数据类型
- 语法
ECMAScript中的一切(变量,函数名,操作符)都区分大小写,如test和Test表示的是两个不同的变量
标识符是变量、函数、属性、函数参数的名字,标识符规则如下:
以字母、下划线( _ )、美元符号( $ )开头,其他还可以是数字;
驼峰命名法,如myName
ES中的语句以分号结尾,如果省略,解析器会自动加上,但是不建议这样 - 变量
ES变量是松散类型 / 弱类型的,就是可以用来保存任何类型的数据 - 数据类型
3.1 typeof 操作符,检测给定变量的类型,typeof 返回值是小写的(undefined),不是大写的( Undefined )!!有以下几个返回值
undefined ---- 给定值未定义
boolean ---- 给定值是布尔值
string ---- 给定值是字符串
number ---- 给定值是数字
object ---- 给定值是对象或者null null表示一个空对象指针
function ---- 给定值是函数
3.2 Undefined 类型
只有一个特殊的 undefined 值,声明了变量但是没有对变量初始化(赋值),这个变量的值就是undefined。
var message;
console.log( message ); // undefined
访问未声明的变量会报错
console.log(res); //Uncaught ReferenceError: res is not defined
typeof 未声明和未初始化的变量都会返回undefined
3.3 Null 类型
只有一个特殊的值 null ,表示空对象的指针,因此typeof null 返回 object。一个将要用于保存变量的对象还没有真正保存对象,应该明确地让这个变量保存null值
3.4 Boolean 类型
只有两个字面值:true和false,True和False不是Boolean值
可以对任何类型的值调用Boolean( )函数,返回一个Boolean值
数据类型 | 转换为true | 转换为false |
---|---|---|
Boolean | true | false |
String | 非空字符串 | 空字符串 " " |
Number | 非零数值 | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
3.5 Number类型
八进制 0 开头,十进制,十六进制 0x开头
NaN 表示一个本来要返回数值但是没有返回数值的操作数
NaN的特点:任何涉及NaN的操作都返回NaN
NaN与任何值都不相等,包括NaN本身
isNaN() 判断传入的值是否不是数值,会先把传入的值转换为数值,任何不能转换为数值的值都会让这个函数返回true,是数值返回false
数值转换规则 Number( )转型函数
数据类型 | 转换规则/值 |
---|---|
Boolean | true转换为1,false转换为0 |
Number | 传入什么转换为什么 |
null | 0 |
undefined | NaN |
String | 只包含数字的字符串,转换为对应的十进制数值;其中包含有效的浮点格式,转换为对应的浮点数值;包含十六进制,转换为对应的十进制数值,以上都会忽略前导零!如 Number(“00023”) 转换为 23;Number(“0002.6”)转换为 2.6;Number(“0xff”)转换为255 |
空字符串转换为0;其他字符串转换未NaN(即不是数值) | |
Object | 先调用对象的valueOf( )方法,依照上述规则转换;如果转换结果为NaN,调用对象的toString( )方法,再次按照上述规则转换 |
parseInt( )和parseFloat( )专门用于把字符串转为数值。
parseInt( ) 会忽略字符串前导空格,直到找到第一个非空字符,第一个字符不是数字字符或负号,返回NaN,第一个字符为数字,继续解析到后续字符或非数字字符(小数点),不会忽略前导零(也就是说可以解析八进制和十六进制,但是在ES5中,不再具有解析八进制的能力,但是可以指定解析的进制基数)
parseFloat( ) 会忽略前导零,只解析十进制,十六进制格式的字符串被转换为0,解析到第二个小数点无效
console.log(parseInt(" 123str")); // 123,忽略前导空格
console.log(parseInt("")); // NaN,空串
console.log(parseInt("0xA")); // 10
console.log(parseInt(" 22.6")); // 22,小数点无效
console.log(parseInt("10", 2)); // 2,指定进制基数
console.log(parseInt("10", 8)); // 8
console.log(parseInt("10", 10)); // 10
console.log(parseInt("10", 16)); // 16
console.log(parseFloat(" 123atr")); // 123
console.log(parseFloat("0xA")); // 0,十六进制
console.log(parseFloat(" 22.6")); // 22.6
console.log(parseFloat(" 22.6.3")); // 22.6,第二个小数点无效
console.log(parseFloat("070")); // 70
3.6 string类型
字符串可以由双引号 / 单引号表示,length属性表字符串的长度
转换为字符串方法一:使用toString( )方法,数值、布尔值、对象和字符串值都有toString( )方法,字符串的toString( )方法返回该字符串的副本,但是null 和 undefined没有这个方法
方法二: 使用转型函数String( ),需要转换的str本身有toString( )方法,调用该方法;是null 则转换为"null";是undefined则转换为"undefined"
3.7 object类型
创建方法:new Object( ) / { }
三.操作符
- 一元操作符
1.1 前置自增/减 ++a 和后置自增/减 a++
a = 2;
console.log(a); // 2
console.log(++a); // 3,输出a自增后的值
console.log(a); // 3
console.log(--a); // 2,,输出a自减后的值
console.log(a); // 2
b = 4;
console.log(b); // 4
console.log(b++); // 4,输出b自增前的值
console.log(b); // 5
console.log(b--); // 5,输出b自减前的值
console.log(b); // 4
1.2 一元加 / 减操作符
如果不是数值,会对操作数执行Number( )转型函数把操作数转换为数值再进行加减
2. 位操作符
按位非( ~ ):0和1转换
按位与( & ):同1才为1
按位或( | ):有1为1
按位异或( ^ ):只有一个1才返回1
左移( << ):把数值的所有位向左移动指定位数
有符号右移( >> ):以符号位填充移动位,向右移动指定位数
无符号右移( >>> ):以0填充移动位,向右移动指定位数,注意对负数的影响,因为负数是用它绝对值的二进制补码表示的,无符号右移后结果会变得很大。
举个栗子:-64无符号右移五位 -64 >>> 5,此时得到的-64的无符号右移结果就很大
64二进制码 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
取反 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
加1 | 1 | |||||||||||||||||||||||||||||||
得到-64的二进制补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
以0填充移动的五位 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
- 布尔操作符
3.1 逻辑非( ! ) 逻辑非操作符会先把操作数转换为一个布尔值(相当于调用了Boolean( ) ),再对其布尔值求反。对一个值同时使用两个布尔值,可以得到这个值真正对应的布尔值,如( !!0 )为 false
3.2 逻辑与( && )属于短路操作,如果第一个操作数是false,返回第一个操作数;如果第一个操作数是true,则返回第二个操作数
3.3 逻辑或( || ),第一个操作数是true,返回第一个操作数;第一个操作数是false,返回第二个操作数 - 乘性操作符,在操作数不是数值时会执行自动的类型转换,调用Number( )
4.1 乘法( * )
只有一个操作数有符号,结果为负数;Infinity * 0 = NaN;
Infinity * Infinity = Infinity;Infinity与非0相乘结果为正负无穷,取决于非0数值的符号
4.2 除法( / )
只有一个操作数有符号,结果为负数;0 / 0 = NaN;
Infinity * Infinity = NaN;非0数值 / Infinity和 0 / 非0数值 结果都为正负无穷,取决于非0数值的符号
4.3 求模( % ) 就是求余数 - 加性操作符
5.1 加法( + ) 若两个操作数都是字符串,则拼接两个操作数;若只有一个操作数是字符串,则把另一个操作数转换为字符串,再拼接
5.2 减法( - )若有一个操作数是字符串、布尔值、null、undefined,现在后台调用Number( )转换为数值,再进行计算,若转换结果为NaN,则减法结果为NaN( NaN进行任何操作都为NaN) - 关系操作符
小于( < )、大于( > )、小于等于( <= )、大于等于( >= )
若两个操作数都是数值,比较大小;都是字符串,比较ASCII 码;若一个操作数是数值,则把另一个操作数转换为数值再比较;一个操作数是布尔值,则转换为数值再比较,大写字母的ASCII码全部小于小写字母的
console.log( "hello" > "Love" ); // true ,因为大写字母的ASCII码全部小于小写字母的
console.log( null == undefined ); // true
console.log( NaN == NaN ); // false
- 相等操作符
7.1 相等( == )和不相等( != )
一个操作数是布尔值,要先转换为数值;
一个是字符串,另一个是数值,把字符串转换为数值;
不可以把null 和undefined转换为其他任何值
任何涉及NaN的操作都是false;
两个操作数都是对象,比较它们是不是同一个对象,两个操作数都指向同一个对象才返回true
7.2 全等( === )和不全等( !== ) 更重要在于比较类型,不会转换操作数,此时null === undefined 为false - 条件操作符(三目运算符)
boolean_expression ? true_value : false_value; - 赋值操作符( += / *= / -= / /=)
四.语句
- if语句
- do-while语句(后测试循环),先执行一次do,while条件满足,返回执行do,再次判断while,直到不满足while跳出循环(至少会执行一次循环体)
var i = 0;
do{
i += 2;
}while(i <= 6);
console.log(i);
- while语句(前测试循环),先判断是否满足循环条件,满足则执行循环体,不满足直接结束,此时有可能一次循环都不执行
- for语句(前测试循环)
var num = 10;
for(var i = 0; i < num; i++){
console.log(i); // 0 1 2 3 4 5 6 7 8 9
}
console.log(i); // 10
最后可以在循环外部访问到 i 是因为ES中没有块级作用域,此时使用var 定义的又是全局变量,因此可以在外部访问到 i
- for-in语句,用来枚举对象的属性,ES中对象的属性是没有顺序的,因此通过for-in 枚举的属性名顺序是不定的
- break语句:立即退出循环,强制继续执行循环后面的语句
- continue语句:立即退出循环,但是退出循环后会从循环顶部继续执行
- switch语句
五.函数
function name(arguments){
//函数体
return ...;
}
name为函数名,也可以不要,就是匿名函数。
arguments是函数的形参,函数的参数在内部是用数组来表示的,通过访问arguments对象的length属性可以获取到参数的个数。arguments对象的长度是由传入的实参个数决定的。指定了形参,没有传入实参,则那个形参默认为undefined
函数会在执行完return语句后立即停止并退出,在return语句后的代码不会执行
ES函数不能像其他语言中函数一样实现重载,因为它没有函数签名,不能定义接收的参数类型和个数。后定义的会覆盖先定义的同名函数