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

相关推荐
leobertlan3 小时前
2025年终总结
前端·后端·程序员
子兮曰3 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
百锦再4 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君4 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再4 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI4 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
颜酱6 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
失忆爆表症6 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录6 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜6 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试