严格模式下的变量typeof对象?

Posted

技术标签:

【中文标题】严格模式下的变量typeof对象?【英文标题】:Variable typeof object in strict mode? 【发布时间】:2015-10-11 00:11:49 【问题描述】:

这段 javascript 在没有 "use strict"; 的情况下运行良好。但是如何在严格模式下检查全局变量是否存在以及它具有什么类型而不会遇到undeclared variable 错误?

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

【问题讨论】:

您必须事先在某处定义a。如果你想让它表现得像一个全局的,也许在最外部的范围内。 @Jamen 我找到了解决方案:***.com/a/32247052/22470 【参考方案1】:

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

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 = ...

【讨论】:

这是if(typeof(a) !== 'undefined') ... 的一个非常复杂的替代方案。【参考方案2】:

在严格模式下创建隐式全局变量是一个错误。您必须明确创建全局:

window.a = ... /* complex operation */

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

【讨论】:

换句话说:没有办法检查变量是否已经在严格模式下声明? 是什么让你这么想?我说typeof a应该仍然像以前一样工作”,我的意思是“非严格”模式。抱歉,如果不清楚。【参考方案3】:

问题是你有一个未声明的变量......你必须把它放在第一位: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.

【讨论】:

你甚至不需要明确地给它一个值。你可以简单地做var a; 是的,你是对的。我提出了一些价值,因为如果他正在检查他拥有什么样的变量,因为他已经有一个价值......如果不是,这没有意义。但是,确实,问题是他从不声明变量。 我想检查变量是否已经声明以及它是否是一个对象。 "use strict",要求所有变量都必须声明,这是因为范围,所以,如果你必须检查,不要使用严格模式。如果您足够严格,您将永远不需要检查是否声明了变量。你要选择,就这么简单。严格模式或未声明的变量。为了检查,您可以执行 'a != undefined' 然后检查 Object 的类型(因为在 Javascript 中都是 Object,请检查我的 utils 变量是否有疑问)。 “因为在 Javascript 中一切都是对象” 原始值不是对象。

以上是关于严格模式下的变量typeof对象?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中严格模式"use strict";需注意的几个雷区:

严格模式

严格模式下的var和let的区别

Javascript严格模式

JS额外知识补充:with语句&eval语句&严格模式

JavaScript高级程序设计(第三版)学习笔记