我有一本书,Essential ActionScript 3(O'Reilly),以了解使用该语言.它提到ActionScript 3是ECMAScript的一个实现,就像Javascript一样.我觉得这很奇怪,因为有很多不同之处.在Javascript中,据我所知,你不能给变量一个类型(var marvin:Robot)或创建"传统"类和接口.但是,这可以在ActionScript中实现.
这是怎么回事?
在JavaScript/ECMAScript/JScript中的Date构造函数允许传递自1970年1月1日午夜以来的毫秒数.无论在客户机器的时区还是格林威治标准时间午夜,我都无法找到文件是否是午夜.这是什么?它可以依赖于不同的浏览器和版本吗?这是官方记录在哪里吗?
我一直在研究自己实施的ECMAScript已有一段时间了.我基本上已经手工完成了所有工作,以帮助深入了解这个过程.反复尝试分析和理解语法的这一部分已经失败,所以我一直在研究项目的其他部分,但现在我正处于对象文字的工作,所以我真的需要对语法分析器进行优化.任何人都可以把这个用语言解析器新手可以理解吗?
我最大的困惑来源如下:
新的MemberExpression参数
这应该是一个成员表达式,但这似乎与以下内容冲突:
NewExpression :
MemberExpression
new NewExpression
新表达式是成员表达式还是左侧表达式?说实话,我在为具体语法布置合适的C#类时遇到了麻烦.
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
NewExpression :
MemberExpression
new NewExpression
CallExpression :
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression . IdentifierName
LeftHandSideExpression :
NewExpression
CallExpression
这是我一直在使用的课程设计,但是当我继续研究规范时,我的怀疑就不会消失.
public abstract class LeftHandSideExpression : ConcreteExpression
{
}
public sealed class NewExpression : LeftHandSideExpression
{
public NewExpression(MemberExpression memberExpression, Arguments arguments)
{
}
public NewExpression(NewExpression newExpression, Arguments arguments)
{
}
}
public sealed class …Run Code Online (Sandbox Code Playgroud) 这是一个关于JavaScript(ECMAScript)语言的基本问题,所以如果它是重复的话我会提前道歉(一点点搜索没有透露我的确切问题).
在ECMAScript中,我们可以使用两种基本的句法形式来获取/设置对象的属性,它们似乎具有完全相同的效果.由于我不知道更好,我会称它们为"属性"和"关联数组"符号:
var o = {};
// Property notation.
o.foo = 'Foo'; // (set)
o.foo; // => "Foo" (get)
// Associative array notation.
o['bar'] = 'Bar'; // (set)
o['bar']; // => "Bar" (get)
// They seem to be interchangeable.
o['foo']; // => "Foo"
o.bar; // => "Bar"
Run Code Online (Sandbox Code Playgroud)
这两种符号之间是否存在真正的差异?显然,关联数组表示法允许我们在对象上查找动态生成的键(并强制将其参数强制转换为字符串),而属性表示法使用文字,但这是唯一的区别吗?
在Javascript中有各种不能在里面使用的保留字Identifiers ; 其中一些实际上留作将来使用.为了澄清一点,一个Identifier是一个Identifier Name但不是保留的词.标识符名称的确切语法与此无关.
根据这里的最后一段,似乎有一些地方可以使用任何一个Identifier Name,即使它是一个保留字.文章提到有效
a.import
a["import"]
a = { import: "test" }
Run Code Online (Sandbox Code Playgroud)
虽然我很清楚第二种形式是合法的,但我一直认为第一种形式和第三种形式都不合法.
实际上,这个资源表示
foo.if
Run Code Online (Sandbox Code Playgroud)
作为无效代码.
是否有一些地方保留的话实际上是有效的?
作为一种动机,我正在编写一个API来传递表单的对象是有意义的
{
in: foo,
out: bar
}
Run Code Online (Sandbox Code Playgroud)
但我不想强迫用户放置括号in.
在专业的Javascript for Web Developers一书中,我读到了在尝试访问原始对象的属性和方法时,JavaScript内部使用原始包装器.这是否意味着每次我尝试访问字符串原语上的length属性时,都会重新计算该值?我的直觉告诉我,因为字符串是固定的,所以它们的长度值存储在某处,只能由包装器访问,但我宁愿确定.
我想检查JavaScript值是否是构造函数,即,它是否具有[[Construct]]内部方法。
ECMAScript定义了IsConstructor,它确实做到了这一点,但这是一个内部操作。
所以我想模仿一下。我曾考虑过尝试在try语句内实例化或子类化,但是在所有情况下都无法可靠地工作。
function isConstructor(value) {
try {
return new value(), true;
} catch(err) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
function isConstructor(value) {
try {
return new value(), true;
} catch(err) {
return false;
}
}
var tests = 0,
failed = 0;
function test(value, expected, msg) {
++tests;
try {
var result = isConstructor(window.eval(value));
} catch(err) {
result = err;
}
if(result !== expected) {
++failed;
console.log('Testing: ' + value + '\nMessage: ' + msg + …Run Code Online (Sandbox Code Playgroud)我正在寻找一种ECMAScript替代方案,作为自定义应用程序逻辑的脚本语言.我喜欢ECMA,特别是新规范的语法(如AS3).
不幸的是,AS3引擎不是开源的,无法集成到项目中.我想要一种专为面向对象使用而设计的脚本语言.
具体来说,是否有一种语言:
我宁愿做的事情
prototype对象您了解哪些语言符合此个人资料?我很难找到专为良好的面向对象设计而设计的高质量脚本语言.
javascript scripting-language dynamic-languages actionscript-3 ecma262
IE9支持ecma-262 edition 5(http://en.wikipedia.org/wiki/ECMAScript),Firefox 4支持javascript 1.8.5(https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8.5).
IE9与ECMA-262第5版的兼容性是否与ECMAScript5相同?
我希望两个javascript引擎之间存在更多差异而不是相似之处,但我很好奇IE9在新的javascript功能方面有多接近Firefox.
以下不起作用(虽然它没有明确的错误),但为什么不呢?
并且...是否真的没有办法解决它,严格使用with语句?忘记使用for/foreach.
with (object1, object2) {
attribute = value;
method();
}
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉在1中提出2个问题.我会尽量让它更清晰:
为什么上面的代码没有给出语法错误,不起作用但被接受with?
如果可能的话,我们如何使用相同的属性更改多个对象with?
希望以下示例将更清楚我想要实现的目标:
var object1 = { attribute: 3 };
var object2 = { attribute: 2, method: function() { alert('blah'); } };
var object3 = { method: function() {alert('bleh'); } };
var value = 4;
with (object1)
with (object2)
with (object3)
{
attribute = value;
method();
}
alert(object1.attribute + object2.attribute);
// resulting alerts should be, …Run Code Online (Sandbox Code Playgroud) ecma262 ×12
javascript ×12
actionscript ×1
c# ×1
constructor ×1
firefox4 ×1
grammar ×1
identifier ×1
properties ×1
standards ×1
string ×1
syntax ×1
time ×1
timezone ×1