严格模式下对象的变量类型是什么?

3

这段 JavaScript 没有使用 "use strict"; 也能正常运行。但是在严格模式下,如何检查全局变量是否存在以及它的类型,而不会遇到 未声明变量 错误?

if (!(typeof a === 'object')) {
    a = ... /* complex operation */
}

你必须在之前的某个地方定义 a。如果你想让它像全局变量一样运行,可能要在最外层作用域中定义。 - user3117575
@Jamen 我找到了一个解决方案:https://dev59.com/DI3da4cB1Zd3GeqPxD1c#32247052 - powtac
3个回答

2

我找到了一种有效的方法来检查JavaScript全局变量a是否存在,而不会触发警告。

hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定属性。

hasOwnProperty()在请求的变量名不存在于全局空间时,不会触发警告!

'use strict';
if (!window.hasOwnProperty('a')) {
    window.a = ... 
    // Or
    a = ...
}

为了确保a是一个对象,请使用:
'use strict';
if (!(window.hasOwnProperty('a') && typeof a === 'object')) {
    window.a = ... 
    // Or
    a = ...
}

1
这是一个非常复杂的替代方案,用于 if(typeof(a) !== 'undefined') ... - Lawrence Dol

1
创建隐含全局变量在严格模式下是一个错误。你必须显式地创建全局变量:
window.a = ... /* complex operation */

typeof a 应该仍然像以前一样工作。


换句话说:在严格模式下,没有办法检查一个变量是否已经声明了? - powtac
你为什么这样想?我说的是 *"typeof a should still work as before"*,我的意思是在“非严格”模式下。如果没有表达清楚,我很抱歉。 - Felix Kling

0
问题在于您有一个未声明的变量...您必须先放置这个:var a = {};。但是,以下是我检查这些类型问题的方法。
var utils = {
  //Check types
  isArray: function(x) {
    return Object.prototype.toString.call(x) == "[object Array]";
  },
  isObject: function(x) {
    return Object.prototype.toString.call(x) == "[object Object]";
  },
  isString: function(x) {
    return Object.prototype.toString.call(x) == "[object String]";
  },
  isNumber: function(x) {
    return Object.prototype.toString.call(x) == "[object Number]";
  },
  isFunction: function(x) {
    return Object.prototype.toString.call(x) == "[object Function]";
  }
}

var a = ""; // Define first, this is your real problem.
if(!utils.isObject(a)) {
  // something here.
}

1
你甚至不需要明确地给它赋一个值。你可以简单地写成 var a; - user3117575
是的,你说得对。我放了一些值,因为如果他正在检查他有什么类型的变量,那是因为他已经有一个值...如果没有这个就没有意义。但是,确实存在问题,他从未声明过这个变量。 - Lucas Tettamanti
我想检查变量是否已经声明,以及它是否是一个对象。 - powtac
"use strict",要求所有变量都必须声明,这是因为作用域的原因,所以如果你需要检查,请不要使用严格模式。如果你足够严格,就永远不需要检查一个变量是否被声明。你必须做出选择,就这么简单。严格模式或未声明的变量。为了检查,你可以做 'a != undefined',然后检查它是什么类型的对象(因为在Javascript中,所有东西都是对象,如果你有疑问,请检查我的utils变量)。 - Lucas Tettamanti
因为在Javascript中,一切都是对象。原始值不是对象。 - Felix Kling
除了 null 和 undefined 之外,所有原始值都有包装在其周围的对象等效物。让我们更加实际一些,这句话有一个上下文... - Lucas Tettamanti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接