JavaScript笔记-原始类型
HermannHesse
2021年02月06日 22:34

JS原始类型

Null和Undefined

null和undefined是javascript的两种基本类型,它们分别只有一个值。

  • Null的值是null

  • Undefined的值是undefine

  • 非严格比较下,null == undefined

undefined表示未初始化或未定义的值。

 

代码块
JavaScript
自动换行
复制代码
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

number表示整数和浮点数

  • 是符合IEEE 754标准的64位浮点数

  • 整数有二进制、八进制、十进制和十六进制表示法

  • 可以用科学计数法表示

  • 精准表示的整数范围从-253+1到 253-1

  • 常量Number.MAX_SAFE_INTEGER=253-1

 

代码块
JavaScript
自动换行
复制代码
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

符号 NaN 表示 Not-a-Number。在计算的过程中,遇到无法表示为数值的情况,计算结果就会是 ' NaN &#​39; 。

  • 如果两个数值是NaN,它们的比较结果是不等的。

  • Number.isNaN 判断

  • 用 Object.is 比较

+0和-0

数值0有+0和-0两种形态,这两个值如果比较的化是相等的。但是如果它们作为除数进行运算,分别会得到+Infinity和-Infinity。

同样,如果一个有限的正数除以Infinity和-infinity分别得到+0和-0。

 console.log(1/Infinity,1/-Infinity); // 0 -0

Boolean

Boolean类型表示逻辑真和逻辑假,它只有两个可选的值,分别是字面量true和false。

  • JS的比较操作返回布尔类型的结果

  • 做布尔判断时存在隐式类型转换

  • +0、-0、NaN、空串、undefined、null转为false

string

JS使用一对单引号 ' &#​39; 或一对双引号 " &#​34; 来表示字符串,单引号和双引号中间不能有换行符。

  • 支持特殊转义符和Unicode转义符

  • 由于HTML标签属性用双引号,所以JS字符串通常推荐用单引号。

常见的转义符

序列代表字符\0Null字符(\u0000)\b退格符(\u0008)\t水平制表符(\u0009)\n换行符(\u000A)\v垂直制表符(\u000B)\f换页符(\u000C)\r回车符(\u000D)"双引号(\u0022)&#​39;撇号或单引号(\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方法

代码块
JavaScript
自动换行
复制代码
 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';
    }
 };
复制成功

 

代码块
JavaScript
自动换行
复制代码
 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支持以一对反引号  ` 表示多行文本,同时也是模板字符串。

  • 多行文本保留空白符

  • 多行文本时模板字符串,可以解析和替换内容

代码块
JavaScript
自动换行
复制代码
 {
     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来定义私有属性。

代码块
JavaScript
自动换行
复制代码
 const size = Symbol('size');
 
 class collection{
     construcctor(){
         this[size]=0;
    }
     
     add(item){
         this[this[size]]=item;
         this[size]++;
    }
     
     static sizeof(instance){
         return instance[size];
    }
 }
复制成功

 

内置Symbol

ES6内置了一些有用的Symbol,可以用力控制对象的一些内部行为。

  • Symbol.iterator

  • Symbol.toPrimitive

  • Symbol.toStringTag

迭代 symbols

Symbol.iterator

一个返回一个对象默认迭代器的方法。被 使用。

Symbol.asyncIterator

一个返回对象默认的异步迭代器的方法。被 使用。

正则表达式 symbols

Symbol.match

一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。

Symbol.replace

一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。

Symbol.search

一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。

Symbol.split

一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split() 使用。

其他 symbols

Symbol.hasInstance

一个确定一个构造器对象识别的对象是否为它的实例的方法。被 instanceof 使用。

Symbol.isConcatSpreadable

一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 Array.prototype.concat() 使用。

Symbol.unscopables

拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。

Symbol.species

一个用于创建派生对象的构造器函数。

Symbol.toPrimitive

一个将对象转化为基本数据类型的方法。

Symbol.toStringTag

用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。

迭代Symbol实例:

 

代码块
JavaScript
自动换行
复制代码
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

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 对象。

代码块
JavaScript
自动换行
复制代码
const a=-1n; 
const b=BigInt.asUnitN(16, a); 
console.log(b); // 65535n const c =BigInt.asIntN(16, b-1n); 
console.log(c); // -2n
复制成功