ES 数据类型
基础数据类型都有哪些?§
- undefiend 没有定义数据类型
- number 数值数据类型,例如 10 或者 1 或者 5.5
- NaN 是一种特殊的 number
- string 字符串数据类型用来描述文本,例如 "你的姓名"
- string 的内置属性和方法:
- 构造函数 String()
- boolean 布尔类型 true | false ,不是正就是反
- boolean 的内置属性和方法:
- 构造函数
- object 对象类型,复杂的一组描述信息的集合
- null 是一种特殊的 object
- object 的内置属性和方法:
- 构造函数
- Object.prototype
- function 函数类型
- 函数的内置属性和方法:
- 构造函数
- Function.prototype
如何理解基础类型/引用类型?§
String 有哪些操作?§
- 属性
- 方法
String.fromCharCode()
String.fromCodePoint()
String.prototype.anchor()
String.prototype.big()
String.prototype.blink()
String.prototype.bold()
String.prototype.charAt()
String.prototype.charCodeAt()
String.prototype.codePointAt()
String.prototype.concat()
String.prototype.endsWith()
String.prototype.fixed()
String.prototype.fontcolor()
String.prototype.fontsize()
String.prototype.includes()
String.prototype.indexOf()
String.prototype.italics()
String.prototype.lastIndexOf()
String.prototype.link()
String.prototype.localeCompare()
String.prototype.match()
String.prototype.matchAll()
String.prototype.normalize()
String.prototype.padEnd()
String.prototype.padStart()
String.prototype.quote()
String.prototype.repeat()
String.prototype.replace()
String.prototype.search()
String.prototype.slice()
String.prototype.small()
String.prototype.split()
String.prototype.startsWith()
String.prototype.strike()
String.prototype.sub()
String.prototype.substr()
String.prototype.substring()
String.prototype.sup()
String.prototype.toLocaleLowerCase()
String.prototype.toLocaleUpperCase()
String.prototype.toLowerCase()
String.prototype.toSource()
String.prototype.toString()
String.prototype.toUpperCase()
[我来译!]String.prototype.trim()
String.prototype.trimRight()
String.prototype.trimStart()
String.prototype.valueOf()
[我来译!]String.prototype[@@iterator]()
String.raw()
Boolean 有哪些操作?§
Undifined/NULL 有哪些操作?§
Function 有哪些操作?§
Function
- 属性
- 方法
Object 有哪些操作?§
Object
- 属性
- 方法
Object.assign()
Object.create()
Object.defineProperties()
Object.defineProperty()
Object.entries()
Object.freeze()
Object.fromEntries()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.getPrototypeOf()
Object.is()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.preventExtensions()
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.seal()
Object.setPrototypeOf()
Object.values()
Number 有哪些操作?§
-
JS 的 Number 类型遵循的是 IEEE 754 标准,使用的是 64 位固定⻓度来表示。
-
IEEE 754 浮点数由三个域组成,分别为 sign bit (符号位)、exponent bias (指数偏移值) 和 fraction (分数值)。64 位中,sign bit 占 1 位,exponent bias 占 11 位,fraction 占 52 位。
-
以 0.1 转换为 IEEE 754 标准表示为例解释一下如何求 exponent bias 和 fraction。转换过程主要经历 3 个过程:
- 将 0.1 转换为二进制表示。
- 将转换后的二进制通过科学计数法表示。
- 将通过科学计数法表示的二进制转换为 IEEE 754 标准表示。
Array 有哪些操作?§
- Array 静态方法:
Array.from(); Array.isArray(); Array.of();
。 - Array 原型方法:
.concat(); .copyWithin(); .entries(); .every();
。.fill(); .filter(); .find(); .findIndex(); .flat(); .flatMap(); .forEach();
。.includes(); .indexOf(); .join(); .keys(); .lastIndexOf(); .map(); .pop(); .push();
。.reduce(); .reduceRight(); .reverse(); .shift(); .slice(); .some(); .sort(); .splice();
。.toLocaleString(); .toSource(); .toString(); .unshift(); .values();
。Array.prototype[@@iterator](); get Array[@@species]
。
- Array 常见考题:
- 数组拷贝。
- 数组展开。
- 用 reduce 实现 map 的功能
- 类数组转化成数组的方法
- 实现数组 flatten
- Object 常见考题:
- 深拷贝、浅拷贝
- 如何判断一个对象是不是空对象?
- 类数组和数组的互相转换?
- Number & BigInt 常见考题:
- 大数操作
- 0.1+0.2 == 0.3?原因?
- 链式调用:add(2, 5),add(2)(5),add(1)(1)(5) 的结果都为 7
BigInt 有哪些操作?§
- JavaScript中Number.MAX_SAFE_INTEGER表示最大安全数字,计算结果是9007199254740991,即在这个数范围内不会出现精度丢失(小数除外)。 但是一旦超过这个范围,js就会出现计算不准确的情况,这在大数计算的时候不得不依靠一些第三方库进行解决,因此官方提出了BigInt来解决此问题。
什么是关联数组?§
其它多数语言里,数组分为索引数组和关联数组,索引数组又分为一维数组、二维数组和多维数组。
引用:“JavaScript 里面没有关联数组和索引数组这两种不同的区分,一切对象都是键值对,数组也是对象,数组也可以看作是键值对。”
自我感悟,存疑:JavaScript 还是有索引数组和关联数组的微小差异。索引数组和 length 属性直接挂钩,关联数组其实访问的是数组上的属性及其值,length 一般都是 0(没有真正的数据内容)。
在计算机科学中,关联数组(英语:Associative Array),又称映射(Map)、字典(Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。一个关联数组中的有序对可以重复(如C中的 multimap)也可以不重复(如 C 中的 map)。这种数据结构包含以下几种常见的操作:
- 向关联数组添加配对
- 从关联数组内删除配对
- 修改关联数组内的配对
- 根据已知的键寻找配对
字典问题是设计一种能够具备关联数组特性的数据结构。解决字典问题的常用方法,是利用散列表,但有些情况下,也可以直接使用二叉查找树或其他结构。
许多程序设计语言内置基本的数据类型,提供对关联数组的支持。而内容定址存储器则是硬件层面上实现对关联数组的支持。
属性值和键值的异同
- 属性和键值不一样,给数组新增一个属性,其依然为数组,length 不变,新增的被读取时将是属性值,而非键值。
var a = [1,2,3]; // 定义一个数组
console.log(a);
console.log(a.length); // 结果为3
a["name"] = "xiaoming"; // 我们再给它赋值,这是给 a 数组增加了一个属性叫 name,而不是在数组里添加数据。
console.log(a); // [1, 2, 3, aaa: 1],a 依然是数组
console.log(a.length); // 结果还是为 3
a.push(4);
console.log(a) // [1, 2, 3, 4, aaa: 1],a 依然是数组
console.log(a.length); // 结果为4
- 以下两种写法效果是一样的,但 j2 符合 JSON 风格,当 JSON 对象作为 Map(映射、关联数组) 时使用。
- JSON 对象和 JSON Map 在运行时看起来是一样的;这个特性与 API 设计相关。当 JSON 对象被当作 Map 使用时,API 文件应当做出说明。
- Map 的键名不一定要遵循属性名称的命名准则。键名可以包含任意的 Unicode 字符。客户端可使用 Map 熟悉的方括号来访问这些属性。
var j1 = {
name: 'j1',
age: 18,
fun: function () {
console.log(1)
}
}
var j2 = {
"name": "j2",
"age": 18,
"fun": function () {
console.log(1)
}
}
遍历关联数组
for (var key in array){
console.log("键:",key);
console.log("值:",array[key]);
}
关联数组和索引数组的遍历效率问题。
遍历赋值以下数组时,第一次耗费时间差不多,浏览器默认优化之后,arr2 作为 Array 而非 Object 存取速度更快。
var arr = new Array(50000000);
var arr2 = {};
什么是 JSON?§
-
JSON 对象包含两个方法:
- 用于解析 JavaScript Object Notation (JSON) 的 parse() 方法
- 以及将对象/值转换为 JSON 字符串的 stringify() 方法。
- 除了这两个方法, JSON 这个对象本身并没有其他作用,也不能被调用或者作为构造函数调用。
- 把数据结构或者对象转换成某种格式的过程称为「序列化」
- 而将序列化过程的结果反向转换回某种数据结构或对象的过程称为「反序列化」。
-
JSON 的本质
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言,JSON 解析器和 JSON 库支持许多不同的编程语言。
- JSON 具有自我描述性,更易理解
-
JSON 风格指南:
- 所有的属性名必须在双引号内。
- JSON对象中不包含注释。
- JSON中的数据元素应以扁平化方式呈现。不能为了方便而将数据任意分组。
- 选择有意义的属性名。
-
- 属性名应该是具有定义语义的有意义的名称。
- 属性名必须是驼峰式的,ASCII 码字符串。
- 首字符必须是字母,下划线(_)或美元符号($)。
- 随后的其他字符可以是字母,数字,下划线(_)或美元符号($)。
- 应该避免使用 Javascript 中的保留关键字
-
在 JSON Map 中键名可以使用任意 Unicode 字符。
JS 常见类型 与 JSON 的区别?§
JavaScript类型 | JSON 的不同点 |
---|---|
对象和数组 | 属性名称必须是双引号括起来的字符串;最后一个属性后不能有逗号。 |
数值 | 禁止出现前导零( JSON.stringify 方法自动忽略前导零,而在 JSON.parse 方法中将会抛出 SyntaxError);如果有小数点, 则后面至少跟着一位数字。 |
字符串 | 只有有限的一些字符可能会被转义;禁止某些控制字符; Unicode 行分隔符 (U+2028)和段分隔符 (U+2029)被允许 ; 字符串必须用双引号括起来。请参考下面的示例,可以看到 JSON.parse() 能够正常解析,但将其当作JavaScript解析时会抛出 SyntaxError 错误: |
let code = '"\u2028\u2029"';
JSON.parse(code); // 正常
eval(code); // 错误
- JSON.parse():解析 JSON 字符串并返回对应的值,可以额外传入一个转换函数,用来将生成的值和其属性, 在返回之前进行某些修改。
- JSON.stringify():返回与指定值对应的JSON字符串,可以通过额外的参数, 控制仅包含某些属性, 或者以自定义方法来替换某些 key 对应的属性值。
- JSON Polyfill:JSON 对象可能不被老版本的浏览器支持。可以将下面的代码放到JS脚本最开始的位置,这样就可以在没有原生支持 JSON 对象的浏览器(如IE6)中使用 JSON 对象。