标签: ecmascript-5

如何为JavaScript对象设置类名

我有一些测试课

TestKlass = (function() {

    function TestKlass(value) {
      this.value = value != null ? value : 'hello world';
      console.log(this.value);
    }

    return TestKlass;

})();

x = new TestKlass;
x instanceof TestKlass; (gives true)
Run Code Online (Sandbox Code Playgroud)

我有新的空物

y = {}
y instanceof Object
Run Code Online (Sandbox Code Playgroud)

我能找到任何方法来为y设置任何属性,就像这样

y.__proto__ = x.__proto__
y.constructor.prototype = x.constructor.prototype
Run Code Online (Sandbox Code Playgroud)

为了得到这个结果

y instanceof TestKlass => true
Run Code Online (Sandbox Code Playgroud)

================================================== ==

UPD:

所以.我的主要目标 - 创建CLONE功能.现在我的解决方案适合我.请看这段代码:

JavaScript JS对象克隆

Object._clone = function(obj) {
  var clone, property, value;
  if (!obj || typeof obj !== 'object') {
    return obj; …
Run Code Online (Sandbox Code Playgroud)

javascript instanceof ecmascript-5

5
推荐指数
1
解决办法
2561
查看次数

重新审视在ECMAScript 5之后扩展原生原型

最近,鉴于对ECMAScript 5中定义属性的更改,我重新讨论了是否可以安全地扩展本机JavaScript原型的问题.事实上,我一直在扩展像Array和Function这样的原型,但出于显而易见的原因,我避免使用Object.在使用Jasmine的单元测试中,通过将Object.prototype规范添加到我自己的个人框架的规范中,使用非可枚举函数扩展Object.prototype 似乎是安全的.但是,像"type"属性这样的数据属性,使用任何异常处理的getter/setter都会产生意想不到的后果.仍然存在与其他图书馆发生冲突的可能性 - 尽管在我的工作中,几乎没有出现过.然而,只要函数不可枚举,看起来扩展Object.prototype就可以是安全的.

你怎么看?现在扩展Object.prototype是否安全?请讨论.

javascript ecmascript-5

5
推荐指数
1
解决办法
319
查看次数

在ECMAScript 6中全局范围内的`this`

我已经尝试过自己查看ES6草案,但我不确定在哪里看:

有人能告诉我,this在ES6中是否必然引用全局对象?此外,此对象是否与全局范围具有相同的成员?

如果您能回答ES5也会有所帮助.

我知道this在全局范围内是指浏览器和大多数其他ES环境中的全局对象,如Node.我只是想知道这是规范定义的行为,还是实现者已添加的扩展行为(如果这种行为在ES6实现中继续).另外,全局对象总是与全局范围相同吗?或者有区别吗?


更新 - 为什么我想知道:我基本上是想弄清楚如何在ES5和6中可靠地获取全局对象.我不能依赖,window因为这是特定于浏览器的,我也不能依赖,global因为这是特定于环境的喜欢Node.我知道this在Node中可以参考module模块范围,但我认为它仍然指的是global全局范围.我想要一个跨环境ES5和6兼容的方式来获取全局对象(如果可能).似乎this在全球范围内我所知道的所有环境都是这样,但我想知道它是否是实际规范的一部分(在我可能不熟悉的任何环境中都是如此可靠).

我还需要知道全局范围和全局对象是否与规范相同.换句话说,全局范围内的所有变量都是一样的globalobject.variable_name吗?


更新2 - 我正在尝试做的事情:

为ES5环境开发了一些ES6垫片.我想知道(1)检查ES6内置函数是否已经存在以便在可能的情况下使用它们而不是我的垫片,以及(2)将垫片添加到全局范围内的最佳方法(1) ins还不存在.

目前我正在遵循这种模式:

(function() {

    // Indirect eval to run in global scope.
    // (We get whatever "this" is in global scope, hoping that it's the global object...
    // Whether this line does what I want it to is the crux of my question.)
    var global …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5 ecmascript-harmony

5
推荐指数
1
解决办法
1775
查看次数

为什么catch子句有自己的词汇环境?

请考虑ECMA-262 v5.1的以下摘录(我最近在这个问题中看到过):

词汇环境是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联.词汇环境由环境记录和外部词汇环境的可能空引用组成.通常,词汇环境与ECMAScript代码的某些特定语法结构相关联,例如TryStatement的FunctionDeclaration,WithStatement或Catch子句,并且每次评估此类代码时都会创建新的词法环境.

我认为这意味着catch子句的主体会像函数那样提升自己的变量,但显然情况并非如此:

var a = 1;
try {
    console.log(x); // ReferenceError
} catch(ex) {
    console.log(a); // 1, not undefined
    var a = 3;
}
Run Code Online (Sandbox Code Playgroud)

有人知道为什么吗?另外,为什么一个catch条款需要自己的词汇环境?

javascript scope try-catch ecmascript-5 hoisting

5
推荐指数
1
解决办法
448
查看次数

为什么〜-1等于0且〜1等于-2?

根据ECMAScript 5.1标准的第11.4.8小节:

生产UnaryExpression:~ UnaryExpression的计算方法如下:

  1. 让我们expr来评估UnaryExpression.
  2. 我们oldValueToInt32(GetValue(expr)).
  3. 返回应用按位补码的结果oldValue.结果是带符号的32位整数.

所述~操作者将调用内部方法ToInt32.在我的理解中ToInt32(1),ToInt32(-1)将返回相同的值1,但为什么~-1等于0且~1等于-2?

现在我的问题是为什么ToInt32(-1)等于-1?ECMAScript 5.1标准的第9.5小节:

抽象操作ToInt32将其参数转换为-2 31到2 31 -1 范围内的2 32个整数值之一.这个抽象操作的功能如下:

  1. 设number是在输入参数上调用ToNumber的结果.
  2. 如果number为NaN,+ 0,-0,+∞或-∞,则返回+0.
  3. 让posInt为sign(number)*floor(abs(number)).
  4. 设int32bit为posInt modulo 2 32 ; 也就是说,具有正号并且幅度小于2 32的数字类型的有限整数值k 使得posInt和k的数学差异在数学上是2 32的整数倍.
  5. 如果int32bit大于或等于2 31,则返回int32bit - 2 32,否则返回int32bit.

当参数为-1时,根据9.5,在步骤1中数字仍为-1,跳过步骤3中的步骤2 posInt将在步骤4中为-1,int32bit将在步骤5中为1,它将返回1

哪一步错了?

javascript operators bitwise-operators ecmascript-5

5
推荐指数
1
解决办法
229
查看次数

Mozilla开发者页面 - 但绝不使用此表单

我的问题是关于Mozilla开发者页面:typeof operator

在示例章节中,每当完成以下表单的比较时,他们会对其进行注释:

typeof Number(1) === 'number'; // but never use this form!
Run Code Online (Sandbox Code Playgroud)

虽然他们从未解释过原因.很容易理解为什么这是一种愚蠢的类型检查方式,但我很好奇他们为什么多次不顾自己的评论.

任何线索都是受欢迎的.

注意:是因为Number()是一个没有new运算符的构造函数吗?(我的第一个猜测)

Ps:代码示例在Firefox的控制台版本27.0中进行了测试

javascript mozilla typeof type-conversion ecmascript-5

5
推荐指数
1
解决办法
101
查看次数

有没有办法在ECMAscript Internationalization API中获取小数和千位分隔符?

我正在尝试使用新的Javascript国际化API,并想知道是否有办法获取Intl.NumberFormat实例的小数和千位(分组)分隔符?

resolvedOptions对象上有一个方法,但不提供符号.

如果有人想知道,那么对于en-US来说,这些将是逗号,和句号.,例如in 1,000.00.

javascript internationalization number-formatting ecmascript-5 ecmascript-intl

5
推荐指数
1
解决办法
1984
查看次数

JavaScript是否具有l值和r值的概念?

在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError.例如,

// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)

要么

// function call expression on the left side
var a;
var fn = function() {return a};
a === fn(); // true
a = 1; // 1
fn() = 5; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)

要么

var a;
a = 1; // 1
(a) = 2; // 2
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. JavaScript也有l值和r值的概念为C吗? …

javascript expression referenceerror ecmascript-5

5
推荐指数
1
解决办法
2160
查看次数

在Java 7上运行符合ECMAScript 5的javascript

我想使用Java 7的嵌入式javascript引擎运行javascript.我尝试运行的代码符合ECMAScript 5,这应该不是问题,因为嵌入式Rhino的版本是支持它的1.7版本3.但是,运行以下代码段不起作用:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    engine.eval("var char = 'a';");
Run Code Online (Sandbox Code Playgroud)

它失败并显示错误missing variable name,表明它char是保留关键字.但是,charECMAScript 5中不再保留,所以我完全糊涂了.问题是哪个javascript版本应该与java 7中的嵌入式Rhino一起使用?

我使用的是java 1.7.0_80,引擎报告的语言版本是1.8引擎版本1.7 release 3 PRERELEASE.

javascript java java-7 ecmascript-5

5
推荐指数
1
解决办法
435
查看次数

JavaScript中有多少参数太多?

我在StackOverflow上遇到了以下问题:有多少参数太多了?

这让我想到,JS函数的参数数量是否存在实际限制?

test(65536); // okay
test(65537); // too many

function test(n) {
    try {
        new Function(args(n), "return 42");
        alert(n + " parameters are okay.");
    } catch (e) {
        console.log(e);
        alert(n + " parameters are too many.");
    }
}

function args(n) {
    var result = new Array(n);
    for (var i = 0; i < n; i++)
        result[i] = "x" + i;
    return result.join(",");
}
Run Code Online (Sandbox Code Playgroud)

事实证明,JavaScript在函数上强加了65536个参数的实际限制.

但是,有趣的是错误消息说限制是65535参数:

SyntaxError: Too many parameters in function definition (only 65535 allowed)
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题:

  1. 为什么会出现这种差异?这是语言实现中的一个错误吗?
  2. ECMAScript标准是否对功能参数施加了此限制?

javascript parameters standards ecmascript-5 ecmascript-6

5
推荐指数
1
解决办法
759
查看次数