《你不知道的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 等

相关推荐
索西引擎7 分钟前
浅谈 Vue 的双向数据绑定
前端·vue.js
iku_ki16 分钟前
axios二次封装-单个、特定的实例的拦截器、所有实例的拦截器。
运维·服务器·前端
断竿散人26 分钟前
前端救急实战:用 patch-package 解决 vue-pdf 电子签章不显示问题
前端·webpack·npm
蓝倾26 分钟前
淘宝获取商品分类接口操作指南
前端·后端·fastapi
十盒半价28 分钟前
深入理解 React 中的 useState:从基础到进阶
前端·react.js·trae
ccc101830 分钟前
前端性能优化实践:深入理解懒加载的实现与最佳方案
前端
轻语呢喃30 分钟前
Babel :现代前端开发的语法转换核心
javascript·react.js
CodeTransfer31 分钟前
今天给大家搬运的是四角线框hover效果
前端·vue.js
归于尽33 分钟前
别让类名打架!CSS 模块化教你给样式上 "保险"
前端·css·react.js
凤凰AI1 小时前
Python知识点4-嵌套循环&break和continue使用&死循环
开发语言·前端·python