目录
变量
1、变量类型:
数字、字符串、布尔值、undefined、null、函数、对象、数组、日期、正则表达式
[绿色字体为基础数据类型 红色字体为引用数据类型]
原始数据类型 JavaScript 的类型分为两种:原始数据类型( Primitive data types )和对象类型(Object types)。 原始数据类型包括:布尔值、数值、字符串、 null 、 undefined 以及 ES6 中的新类型 Symbol 和 ES10 中的新类型 BigInt 。
2、
①在js中,我们只需要使用关键字var,而不必指定变量类型。
②js是弱语言,我们可以随时转换变量类型
③未来的Javascript标准ECMAScript(如ES5/6/7)会加入可选的静态变量类型。也可以使用TypeScript对变量类型进行设置定义。
ECMA 是一个将信息标准化的组织。JavaScript 被提交到ECMA组织进行标准化,由此诞生了一个新的语言标准,也就是我们所知道的ECMAScript。JavaScript 是该标准(最流行)的一个实现。
JavaScript 是一种主要在浏览器中运行的语言(也可以运行于NodeJS 服务端、桌面端和移动端设备中),每个浏览器都可以实现自己版本的JavaScript 功能。这个具体的实现是基于ECMAScript 的,因此浏览器提供的功能大都相同。然而,不同的浏览器之间,每个功能的行为也会存在细微的差别。
ES5 : 09年发布
ES6(ES2015) : 15年发布,
ES7(ES2016) : 16年发布,ES8(ES2017): 17年发布
JavaScript的一个超集(TypeScript 并不是一个完全新的语言, 它是 JavaScript 的超集,为 JavaScript 的生态增加了类型机制,并最终将代码编译为纯粹的 JavaScript 代码。基于ES6),而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。TypeScript扩展了JavaScript的 语法,所以任何现有的JavaScript程序可以不加改变的在TypeScript下工作。TypeScript是为大型应用之开发而设计,而编译时它 产生 JavaScript 以确保兼容性。而JavaScript只是一个脚本语言,并非设计用于开发大型 Web 应用,JavaScript 没有提供类和模块的概念(es6引入类与模块的概念),而TypeScript扩展实现了这些特性。
④下面的代码,声明了变量a和变量b。null表示该变量没有值。而变量b则是声明了undefined变量。undefined表示变量已被声明,单尚未赋值。
var a = null;
var b;
运算符
js运算符包含算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、一元运算符、其他运算符。
位运算符
什么是位运算符?
JavaScript 中的数字常量一般用十进制表示。数值运算一般先转换成二进制再进行运算。而位运算则是直接进行二进制运算。
在执行位运算之前,JavaScript 将数字转换为 32 位有符号整数(二进制)。执行按位操作后,结果将转换回 64 位 JavaScript 数(十进制)。
JS使用二进制表达数值,最高位(起始位)决定正负,0是正数,-1是负数。
1、&按位与
&是二元运算符,它以特定的方式的方式组合操作数中对应的位,如果两个二进制列对应的位都为1,那么结果就是1, 如果对应的两个位中任意一个位是0 则结果就是0。
1 & 3的结果为1
应用:
将数字与1(因为1是00000001最后一位是1,前七位是0,而偶数最后一位是0)进行比较从而判断其奇偶性。当n & 1 === 0时则为偶数,n & 1 === 1时则为奇数。
2 & 1
=>0
3 & 1
=>1
4 & 1
=>0
2、| 按位或
|运算符跟&的区别在于如果对应的位中任一个操作数为1 那么结果就是1。
4 | 3
=> 7
可以用一个数和0进行(|)|按位或操作来向下取整,比如 3.14 | 0= 3。(因为0是00000000,取整数n只会与0对较前八位且会被直接复制)
console.log(3.14 | 0);
3、 ^按位异或
^运算符跟|类似,但是还是有点不同。两个数值的对应位只有一个为1时结果才是1,否则为0。
5 ^ 6
=> 3
连续对两个数a和b进行三次异或运算(aˆ=b;bˆ=a; aˆ=b;),可以互换它们的值。
此外,整数与整数本身按位异或得到的是0(因为每两个对应的数字都相同,所以最后返回的都是0)。
整数与0按位异或得到的是其本身,小数与0按位异或可以取整。
整数^0=整数本身
小数^0=整数
4、~否运算
运算符是对位求反,1变0,0变1,也就是求二进制的反码。(反转所有位)
记住,否运算符的结果永远是+1后取反数
console.log(~-11); //10
console.log(~-1); //0
console.log(~0); //-1
~3 // -4
执行否位运算时,JavaScript 内部将所有的运算子都转为32位的二进制整数再进行运算。3的32位整数形式是00000000000000000000000000000011,二进制否运算以后得到11111111111111111111111111111100。由于第一位(符号位)是1,所以这个数是一个负数。JavaScript 内部采用补码形式表示负数,即需要将这个数减去1,再取一次反,然后加上负号,才能得到这个负数对应的10进制值。这个数减去1等于11111111111111111111111111111011,再取一次反得到00000000000000000000000000000100,再加上负号就是-4。
5、<<左移
通过从右推入零向左位移,并使最左边的位脱落。对于其移动规则只需记住丢弃最高位,0补最低位即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
6 << 2
24
6、>>右移
左边补位,右边脱落,与左移相反。左边补上符号位即按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
6>>1
3
前增/减量(++n)和后增/减量(n++)的区别
真假值
Javascript常见变量类型对应的真假值:
布尔值 | true为true,false为false |
undefined | false |
null | false |
数 | +0 -0 NaN是false 其他是true |
字符串 | 空串(0长度)是false,其他是true |
对象 | true |
function checkTruthy(val) {
return val ? console.log('true') : console.log('false')
}
checkTruthy(true) // true
checkTruthy(new Boolean(false)) //true 对象始终为true
checkTruthy('') // false
checkTruthy(new String('')) // true
checkTruthy(new Number(NaN)) // true
var a = {};
checkTruthy(a); // true
checkTruthy(a.b) // false
相等运算符
相等运算符包括相等符==和全等符===
相等运算符==
相等运算符比较两个变量,当两个变量数据类型相同时,js用equals方法比较两个值或对象。
当两个变量的数据类型不相同,js会先进行隐形转换,再进行比较:
①原始类型的值(常见布尔值、数值、字符串、 null 、 undefined ) 原始类型的数据会转换成数值类型再进行比较。字符串和布尔值都会转换成数值.。
这种比较运用到js内部的toNumber方法。
1 == true; // true
// 等同于 1 === 1
0 == false; // true
// 等同于 0 === 0
2 == true; // false
// 等同于 2 === 1
2 == false; // false
// 等同于 2 === 0
'true' == true; // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1
'' == 0; // true
// 等同于 Number('') === 0
// 等同于 0 === 0
'' == false; // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0
'1' == true; // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1
'\n 123 \t' == 123; // true
// 因为字符串转为数字时,省略前置和后置的空格
② 对象与原始类型值比较 对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
[1] == 1 // true
// 等同于 Number([1]) == 1
[1] == '1' // true
// 等同于 Number([1]) == Number('1')
[1] == true // true
// 等同于 Number([1]) == Number(true)
③ undefined或null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
来看看toNumber方法对不同类型变量的返回结果:
undefined | NaN |
null | +0 |
布尔值 | true为1 false为+0 |
数 | 数对应值 |
经典面试题
console.log('abc' == true)
输出为false。
运算过程:布尔值true被toNumber转成数1,此时判断'abc' == 1
toNumber转换字符串,因为字符串包含字母因此会被转为NaN,此时判断NaN == 1
所以结果为false
面试题二:
console.log('abc' == false)
答案也是false。false布尔值转换成0,‘abc’转成NaN,0 == NaN,结果是false
全等运算符(严格相等运算符)
比较过程:如果两个值类型不同,则为false。如果两个值的类型相同,则会根据下标判断:
数 | x y值相同 但不能是NaN | true |
字符串 | xy是相同字符 且 '' === ''是true | true |
布尔值 | xy都是false或true | true |
对象 | xy引用同一个对象 | true |
经典面试题:
console.log('abc' === true) //false 类型不同
console.log('abc' === 'abc') // true
var p1 = {name:'dd'};
var p2 = {name:'dd'};
p1 === p2 //false 不同对象
p1 == p2 // false