JavaScript 全局对象

2018-09-16  本文已影响87人  igor_d140

全局的对象( global objects )或称标准内置对象,
不要和 "全局对象(global object)" 混淆。
这里说的全局的对象是说在全局作用域里的对象。

"全局对象 (global object)” 是一个Global类的对象。
可以在全局作用域里,用this访问(但只有在非严格模式下才可以,
在严格模式下得到的是 undefined)。实际上,
全局作用域包含了全局对象的属性,还有它可能继承来的属性。

全局对象(global object)在javascript中有着重要的用途:
全局对象的属性是全局定义的符号,js程序可以直接使用。
当javascript解释器启动时(或web浏览器加载新页面时),
它将创建一个新的全局对象,并给它一组定义的初始属性。

全局作用域中的其他对象可以由用户的脚本创建或由宿主程序提供。
浏览器作为最常见的宿主程序,其所提供的宿主对象的说明可以在这里找到:

全局作用域中的其他对象可以由用户的脚本创建或由宿主程序提供。浏览器作为最常见的宿主程序,其所提供的宿主对象的说明可以在这里找到:API 参考。 关于 DOM 和核心 JavaScript之间的区别,可参阅 JavaScript 技术概述 来了解更详细的信息。

标准内置对象的分类

值属性

这些全局属性返回一个简单值,这些值没有自己的属性和方法。

函数属性

基本对象

顾名思义,基本对象是定义或使用其他对象的基础。基本对象包括一般对象、函数对象和错误对象。

数字和日期对象

用来表示数字、日期和执行数学计算的对象。

字符串

用来表示和操作字符串的对象。

可索引的集合对象

这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。

使用键的集合对象

这些集合对象在存储数据时会使用到键,支持按照插入顺序来迭代元素。

矢量集合

SIMD
"SIMD: SIMD (pronounced "seem-dee") is short for Single Instruction/Multiple Data which
is one classification of computer architectures. SIMD allows one same operation to
be performed on multiple data points resulting in data level parallelism and thus
performance gains, for example for 3D graphics and video processing,
physics simulations or cryptography, and other domains.")
矢量集合中的数据会被组织为一个数据序列。

结构化数据

这些对象用来表示和操作结构化的缓冲区数据,或使用 JSON (JavaScript Object Notation)编码的数据。

控制抽象对象

反射

国际化

为了支持多语言处理而加入ECMAScript的对象。

WebAssembly

其他

Infinity

是全局对象(global object)的一个属性,即它是一个全局变量。

Infinity 属性的属性特性:
writable false
enumerable false
configurable false

Infinity 的初始值是 Number.POSITIVE_INFINITY。Infinity(正无穷大)大于任何值。
该值和数学意义上的无穷大很像,例如任何正值乘以 Infinity 为 Infinity,
任何数值(除了Infinity 和 -Infinity)除以 Infinity 为 0。

在 ECMAScript 5 的规范中, Infinity 是只读的(实现于 JavaScript 1.8.5 / Firefox 4)。


  console.log(Infinity          ); /* Infinity */  
  console.log(Infinity + 1      ); /* Infinity */  
  console.log(Math.pow(10, 1000)); /* Infinity */  
  console.log(Math.log(0)       ); /* -Infinity */  
  console.log(1 / Infinity      ); /* 0 */
NaN

全局属性 NaN 的值表示不是一个数字(Not-A-Number)。

NaN 属性的属性特性:
writable false
enumerable false
configurable false
NaN 是一个全局对象的属性。

NaN 属性的初始值就是 NaN,和 Number.NaN 的值一样。在现代浏览器中(ES5中),
NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。
但在ES3中,这个属性的值是可以被更改的,但是也应该避免覆盖。

编码中很少直接使用到 NaN。通常都是在计算失败时,作为 Math 的某个方法的返回值出现的
(例如:Math.sqrt(-1))或者尝试将一个字符串解析成数字但失败了的时候
(例如:parseInt("blabla"))。

等号运算符(== 和 ===) 不能被用来判断一个值是否是 NaN。必须使用 Number.isNaN() 或 isNaN() 函数。在执行自比较之中:NaN,也只有NaN,比较之中不等于它自己。


  NaN === NaN;        // false
  Number.NaN === NaN; // false
  isNaN(NaN);         // true
  isNaN(Number.NaN);  // true

undefined

全局属性undefined表示原始值undefined。它是一个JavaScript的 原始数据类型 。

undefined 属性的属性特性:
writable false
enumerable false
configurable false

undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。
undefined的最初值就是原始数据类型undefined。

在现代浏览器(JavaScript 1.8.5/Firefox 4+),自ECMAscript5标准以来undefined是一个不能被配置
(non-configurable),不能被重写(non-writable)的属性。即便事实并非如此,也要避免去重写它。

一个没有被赋值的变量的类型是undefined。如果方法或者是语句中操作的变量没有被赋值,
则会返回undefined(对于这句话持疑惑态度,请查看英文原文来理解)。


  function test(a){
      console.log(typeof a);    // undefined
      return a;
  }

  test();                       // 返回"undefined"

  一个函数如果没有使用return语句指定返回值,就会返回一个undefined值。

严格相等和undefined

你可以使用undefined和严格相等或不相等操作符来决定一个变量是否拥有值。
在下面的代码中,变量x是未定义的,if 语句的求值结果将是true

var x;

if (x === undefined) {
// 执行这些语句
} else {
// 这些语句不会被执行
}

注意:这里是必须使用严格相等操作符(===)而不是标准相等操作符(==),
因为 x == undefined 会检查x是不是null,但是严格相等不会检查。
null不等同于undefined。

Typeof 操作符和undefined

var x;
if(typeof x === 'undefined') {
    // 执行这些语句
}
使用 typeof的原因是它不会在一个变量没有被声明的时候抛出一个错误。

// 这里没有声明y
if(typeof y === 'undefined') {       // 没有错误,执行结果为true
   console.log("y is " + typeof y )  // y is undefined
}

if(y === undefined) {                // ReferenceError: y is not defined

}

但是,技术方面看来这样的使用方法应该被避免。JavaScript是一个静态作用域语言,
所以,一个变量是否被声明可以通过看它是否在一个封闭的上下文中被声明。
唯一的例外是全局作用域,但是全局作用域是被绑定在全局对象上的,
所以要检查一个变量是否在全局上下文中存在可以通过检查全局对象上是否存在这个属性(比如使用in操作符)。

Void操作符和undefined

void 操作符是第三种可以替代的方法。

var x;
if(x === void 0) {
    // 执行这些语句
}

// 没有声明y
if(y === void 0) {
    // 抛出一个RenferenceError错误(与`typeof`相比)
}
null

值 null 特指对象的值未设置。它是 JavaScript 基本类型 之一。

值 null 是一个字面量,它不像undefined 是全局对象的一个属性。
null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,
也许更好理解。在 APIs 中,null 常在返回类型是对象,但没关联值的地方使用。

// foo不存在,它从来没有被定义过或者是初始化过:
foo;
"ReferenceError: foo is not defined"

// foo现在已经是知存在的,但是它没有类型或者是值:
var foo = null; 
foo;
null

null 与 undefined 的不同点:

当检测 null 或 undefined 时,注意相等(==)与全等(===)两个操作符的区别 ,前者会执行类型转换:

typeof null        // "object" (因为一些以前的原因而不是'null')
typeof undefined   // "undefined"
null === undefined // false
null  == undefined // true
null === null // true
null == null // true
!null //true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
上一篇下一篇

猜你喜欢

热点阅读