null和undefined是javascript的两种基本类型,它们分别只有一个值。
Null的值是null
Undefined的值是undefine
非严格比较下,null == undefined
undefined表示未初始化或未定义的值。
let foo; //标量标识符被声明而未被初始化
console.log(foo); //undefined
function bar(a,b){
return [a,b]
}
//bar函数的弟二个形参没有传入实参
console.log(bar(1)); //[1,undefined]
let sun = 0;
function addSum(num){
sum+=num;
}
//addSum没有return值
console.log(addSum(10));// undefined
//访问p对象不存在的z属性
let p={x:1,y:2};
console.log(p.z); //undefined
null表示不确定的值。
let foo=null;
console.log(foo); //null
number表示整数和浮点数
是符合IEEE 754标准的64位浮点数
整数有二进制、八进制、十进制和十六进制表示法
可以用科学计数法表示
精准表示的整数范围从-253+1到 253-1
常量Number.MAX_SAFE_INTEGER=253-1
0
7
-3
0b101 //二进制表示5,0b前缀表示二进制
0o777 //八进制表示511,0o前缀表示八进制
-0x7f //十六进制表示-127,0x前缀表示16进制
3e9 //科学计数法表示3000000000
let n1= 10,
n2= Number.MAX_SAFE_INTEGER,
n3= 1,2;
console.log(Number.MAX_SAFE_INTEGER(n1),
Number.isSafeInteger(n2),
//n3是浮点数不是整数,所以结果也为false
Number.isSafeInteger(n3),
Number.isSafeInteger(n2 + 1));
//true.true,false,false
浮点数是可以表示小数
规范规定浮点数的整数部分如果是0,0可以省略。
浮点数也可以使用科学计数法。
最大浮点数 Number.MAX_VALUE // 1.7976931348623157e+308
最小浮点数 Number.MIN_VALUE // 5e-324
浮点数精度 Number.EPSILON //2.220446049250313e-16
无穷大数 Infinity 可以为 Infinity == Number.MAX_VALUE * 2 == 1 / 0 ,也可以负数-Infinity
浮点数运算存在精度问题,不论用 == 和 === 比较浮点数
不可用相等比较浮点数
不可用相等比较浮点数
不可用相等比较浮点数
符号 NaN 表示 Not-a-Number。在计算的过程中,遇到无法表示为数值的情况,计算结果就会是 ' NaN ' 。
如果两个数值是NaN,它们的比较结果是不等的。
Number.isNaN 判断
用 Object.is 比较
数值0有+0和-0两种形态,这两个值如果比较的化是相等的。但是如果它们作为除数进行运算,分别会得到+Infinity和-Infinity。
同样,如果一个有限的正数除以Infinity和-infinity分别得到+0和-0。
console.log(1/Infinity,1/-Infinity); // 0 -0
Boolean类型表示逻辑真和逻辑假,它只有两个可选的值,分别是字面量true和false。
JS的比较操作返回布尔类型的结果
做布尔判断时存在隐式类型转换
+0、-0、NaN、空串、undefined、null转为false
JS使用一对单引号 ' ' 或一对双引号 " " 来表示字符串,单引号和双引号中间不能有换行符。
支持特殊转义符和Unicode转义符
由于HTML标签属性用双引号,所以JS字符串通常推荐用单引号。
常见的转义符
序列代表字符\0Null字符(\u0000)\b退格符(\u0008)\t水平制表符(\u0009)\n换行符(\u000A)\v垂直制表符(\u000B)\f换页符(\u000C)\r回车符(\u000D)"双引号(\u0022)'撇号或单引号(\u0027)\反斜杠(\u005C)\xXX由 2 位十六进制数值 XX 指定的 Latin-1 字符\uXXXX由 4 位十六进制数值 XXXX 指定的 Unicode 字符\XXX由 1~3 位八进制数值(000 到 377)指定的 Latin-1 字符,可表示 256个 字符。如 \251 表示版本符号。注意,ECMAScript 3.0 不支持,考虑到兼容性不建议使用。
字符串可以使用Spread操作符展开成字符数组。可以使用codePointAt方法来获得某位字符的Unicode码位。
Unicode码位以多字节Unicode编码表示一位字符
String.fromCodePoint方法可以将码位还原为字符串
字符串可以与其他类型数据相互操作
+操作符触发其他的隐藏类型转化
Number.parseInt与Number.parseFloat
显示类型转化
对象的toString方法
console.log([1+2,'1'+2,'1'-2]);
// [3,"12",-1]
console.log(Number.parseInt('100abc',2)); //4
console.log(Number('0b100')); //4
console.log(Number.parseFloat('12.3e10xx'));
//1230000000000
var foo={ //对象的 toString方法
toString(){
return 'foo';
}
};
console.log(foo+'bar'); // foobar
字符串内置常用方法
字符串连接:用+连接即可,或使用join方法
大小写转化:toUpperCase( ) 和toLowerCase( )
逆序:reverse( )
截取:slice(2,3)截取2,3之间的字符,substr(2,3)是指2后面三个字符。 例如 hello的slice(2,3)为 ‘ l ’ ,而substr为 ‘ llo ’ 。
查找:indexof()
替换:repalce()
字符串方法说明charAt()返回字符串中的第 n 个字符charCodeAt()返回字符串中的第 n 个字符的代码indexOf()检索字符串lastIndexOf()从后向前检索一个字符串match()找到一个或多个正则表达式的匹配,能够找出所有匹配的子字符串,并以数组的形式返回search()检索与正则表达式相匹配的子串,search() 方法和 indexOf() 的功能是相同的,查找指定字符串第一次出现的位置。但是 search() 方法仅有一个参数,定义匹配模式。
replace() 方法的第二个参数可以使用函数,当匹配时会调用该函数,函数的返回值将作为替换文本使用,同时函数可以接收以为前缀的特殊字符,用来引用匹配文本的相关信息。
约定字符串说明、2、...、$99与正则表达式中的第 1~99 个子表达式相匹配的文本$&(美元符号+连字符)与正则表达式相匹配的子字符串$’(美元符号+切换技能键)位于匹配子字符串左侧的文本$'(美元符号+单引号)位于匹配字符串右侧的文本$$表示 $ 字符串
ES6之后,JS支持以一对反引号 ` 表示多行文本,同时也是模板字符串。
多行文本保留空白符
多行文本时模板字符串,可以解析和替换内容
{
let who='月影',what='月饼';
const tpl2=`${who}所做的${what}
是全天下
最好吃的`;
console.log(tpl2);
} Symbol
ES6及之后的版本中引入的新原始数据类型。Symbol可以创建唯一标识。
作为对象的key
Symbol.for 可以作为全局变量
Symbol.keyFor 取出其设置的关键字
symbol 是一种基本数据类型 (primitive data type)。函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:""。
每个从返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
新的语言标准中private field有些不理想,所以也可以采用Symbol来定义私有属性。
const size = Symbol('size');
class collection{
construcctor(){
this[size]=0;
}
add(item){
this[this[size]]=item;
this[size]++;
}
static sizeof(instance){
return instance[size];
}
}
ES6内置了一些有用的Symbol,可以用力控制对象的一些内部行为。
Symbol.iterator
Symbol.toPrimitive
Symbol.toStringTag
Symbol.iterator
一个返回一个对象默认迭代器的方法。被 使用。
Symbol.asyncIterator
一个返回对象默认的异步迭代器的方法。被 使用。
Symbol.match
一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。
Symbol.replace
一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。
Symbol.search
一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。
Symbol.split
一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split() 使用。
Symbol.hasInstance
一个确定一个构造器对象识别的对象是否为它的实例的方法。被 instanceof 使用。
Symbol.isConcatSpreadable
一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 Array.prototype.concat() 使用。
Symbol.unscopables
拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。
Symbol.species
一个用于创建派生对象的构造器函数。
Symbol.toPrimitive
一个将对象转化为基本数据类型的方法。
Symbol.toStringTag
用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。
迭代Symbol实例:
Class Path{
constructor(){
this_points=[];
}
add(...points){
this._points.push(...points);
}
*[Symbol.iterator](){
yield *this._points;
}
get length(){
return this._points.length;
}
}
const path=new path();
path.add([1,1],[1,2],[2,3]);
console.log(path.length);
for(let point in path){
console.log(point); //[1,1],[1,2],[2,3]
}
BigInt是JavaScript新的原始类型,可以精确表示大于253 -1的整数
Bigint字面量:数字+n
BigInt运算:不能与Number直接进行运算
显式类型转化:BigInt与Number相互转换构造器静态方法
width可存储整数的位数。
bigint要存储在指定位数上的整数。
BigInt.asIntN()将 BigInt 值转换为一个 -2width-1 与 2width-1-1 之间的有符号整数。
BigInt.asUintN()将一个 BigInt 值转换为 0 与 2width-1 之间的无符号整数。语法BigInt.asUintN(width, bigint);参数
BigInt()创建BigInt 对象。
const a=-1n;
const b=BigInt.asUnitN(16, a);
console.log(b); // 65535n const c =BigInt.asIntN(16, b-1n);
console.log(c); // -2n