《你不知道的JavaScript-中卷》第一部分-类型和语法-笔记-3-原生函数

常用的原生函数有:

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Error()
  • Symbol()------ES6中新加入的!

3.1 内部属性 [[Class]]

所有 typeof 返回值为 "object" 的对象(如数组)都包含一个内部属性 [[Class]]

  • 这个属性无法直接访问,一般通过 Object.prototype.toString(..) 来查看
js 复制代码
console.log(Object.prototype.toString.call([1, 2, 3])); //[object Array]
console.log(Object.prototype.toString.call(/regex-literal/i));//[object RegExp]

console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]

console.log(Object.prototype.toString.call(new Date()));//[object Date]
console.log(Object.prototype.toString.call(new Error()));//[object Error]
console.log(Object.prototype.toString.call(new RegExp()));//[object RegExp]
console.log(Object.prototype.toString.call(new String()));//[object String]
console.log(Object.prototype.toString.call(new Number()));//[object Number]
console.log(Object.prototype.toString.call(new Boolean()));//[object Boolean]
console.log(Object.prototype.toString.call(new Object()));//[object Object]
console.log(Object.prototype.toString.call(new Function()));//[object Function]

3.2 封装对象包装

JavaScript 会自动为基本类型值包装(box 或者 wrap)一个封装对象

js 复制代码
var a = "abc";

a.length; // 3

a.toUpperCase(); // "ABC"

封装对象释疑

我们为 false 创建了一个封装对象,然而该对象是真值,所以这里使用封装对象得到的结果和使用 false 截然相反

js 复制代码
var a = new Boolean(false);
if (!a) {
    console.log("Oops"); // 执行不到这里
}

3.3 拆封

如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数

  • 在需要用到封装对象中的基本类型值的地方会发生隐式拆封
js 复制代码
var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );

a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true

var b = a + ""; // b的值为"abc"
typeof a; // "object"
typeof b; // "string"

3.4 原生函数作为构造函数

数组(array)、对象(object)、函数(function)和正则表达式,我们通常喜欢以常量的形式来创建它们。实际上,使用常量和使用构造函数的效果是一样的

3.4.1 Array(..)

  • 构造函数 Array(..) 不要求必须带 new 关键字,Array(1,2,3) 和 new Array(1,2,3) 的效果是一样的
  • Array 构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度(length),而非只充当数组中的一个元素。
  • 永远不要创建和使用空单元数组。
js 复制代码
var a = new Array(1, 2, 3);
console.log(a); // [1, 2, 3]

var b = [1, 2, 3];
console.log(b);// [1, 2, 3]

var c = new Array(4);
console.log(c); //[空 ×4]

3.4.2 Object(..)、Function(..) 和 RegExp(..)

除非万不得已,否则尽量不要使用 Object(..)/Function(..)/RegExp(..):

3.4.3 Date(..) 和 Error(..)

创建日期对象必须使用 new Date()。

  • Date(..) 可以带参数,用来指定日期和时间,而不带参数的话则使用当前的日期和时间。
  • Date(..) 主要用来获得当前的 Unix 时间戳(从 1970 年 1 月 1 日开始计算,以秒为单位

构造函数 Error(..)(与前面的 Array() 类似)带不带 new 关键字都可

  • 创建错误对象(error object)主要是为了获得当前运行栈的上下文
  • 错误对象通常与 throw 一起使用
js 复制代码
function foo(x) {
    if (!x) {
        throw new Error( "x wasn't provided" );
    }
    // ..
}

3.4.4 Symbol(..)

符号是具有唯一性的特殊值(并非绝对),用它来命名对象属性不容易导致重名

  • 符号可以用作属性名
  • 可以使用 Symbol(..) 原生构造函数来自定义符号
js 复制代码
var mysym = Symbol("my own symbol");
console.log(mysym);// Symbol(my own symbol)
console.log(mysym.toString()); // "Symbol(my own symbol)"
console.log(typeof mysym); // "symbol"
var a = {};
a[mysym] = "foobar";
console.log(Object.getOwnPropertySymbols(a));// [ Symbol(my own symbol) ]

3.4.5 原生原型

原生构造函数有自己的 .prototype 对象,如 Array.prototype、String.prototype 等

相关推荐
excel9 分钟前
迭代器与生成器全面理解
前端
可口码农21 分钟前
MixOne:Electron Remote模块的现代化继任者
java·前端·electron
大聪明了26 分钟前
uniapp vue3 使用 pinia
javascript·vue.js·uni-app
发如雪-ty27 分钟前
Bash常用操作总结
前端·chrome
冲!!38 分钟前
使用nvm查看/安装node版本
前端·node.js·node·nvm
LilyCoder1 小时前
HTML5二十四节气网站源码
前端·javascript·html·html5
Bruce_Liuxiaowei1 小时前
跨站脚本攻击(XSS)高级绕过技术与防御方案
前端·网络安全·xss
EF@蛐蛐堂2 小时前
【vue3】v-model 的 “新玩法“
前端·javascript·vue.js
两个月菜鸟2 小时前
vue+微信小程序 五角星
前端·vue.js·微信小程序
GISer_Jing3 小时前
React手撕组件和Hooks总结
前端·react.js·前端框架