前端面试的一些知识点(JavaScript) - 对象

###基础

undefined 不是保留字,可以作为变量名出现在全局作用域以外的其他作用域。

1
2
3
// 全局下的 undefined 不可写
Object.getOwnPropertyDescriptor(window,"undefined");
//Object {value: undefined, writable: false, enumerable: false, configurable: false}

通过 typeof 来判断变量是否已声明。

1
typeof x === 'undefined' // 返回 true

如何判断变量的值既不是 undefined 也不是 null

1
2
3
4
5
typeof null 
// typeof null 会返回 'object',所以有更好的办法
function isDefined(x) {
return x !== null && x !== undefined; // 这里不能写成 'undefined'
}

如何区分对象值原始值

1
2
3
4
5
6
7
8
9
10
11
12
13
// 普通的方法
function isObject(x) {
return (typeof x === "function" || (typeof x === "object" && x !== null));
}
// 更好的方法
function isObject(x) {
return x === Object(x);
}
// 不能使用 instanceof
var obj = Object.create(null); // 注意,这里的 obj 没有 prototype
Object.getPrototypeOf(obj) // null
typeof obj // 'object'
obj instanceof Object // false

获得原始值的类型(修正了 typeof null 返回 object 的错误)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getPrimitiveTypeName(x) {
var typeName = typeof x;
switch(typeName) {
case "undefined":
case "boolean":
case "number":
case "string":
return typeName;
case "object":
if (x === null) { // 修正了 typeof null 返回 object 的错误
return "null";
}
default: // fall through from prev. case
throw new TypeError("Argument isn’t primitive: "+x);
}
}

void 运算符是给指定表达式求值,并且返回 undefined,通常只用于获取 undefined 的原始值

1
2
3
4
5
6
var x;
if (x === void 0) {
// 执行到这里
}
if (y === void 0) { // y 未声明,抛出 ReferenceError 异常
}

在使用立即执行函数表达式时,可以利用 void 运算符让 JavaScript 引擎把一个函数识别成函数表达式而不是函数声明(语句)

1
2
3
4
5
6
7
8
9
10
11
void function iife() { // 去掉 void 会抛出异常,函数声明不能立即执行。
var bar = function () {};
var baz = function () {};
var foo = function () {
bar();
baz();
};
var biz = function () {};
foo();
biz();
}();

下一集:函数

参考

What is JavaScript’s typeof operator used for?

Improving the JavaScript typeof operator