相关疑难解决方法(0)

每个JavaScript程序员应该知道什么?

每个JavaScript程序员都应该知道一组能够说"我知道JavaScript"的东西吗?

javascript programming-languages

368
推荐指数
17
解决办法
8万
查看次数

如何在JavaScript/jQuery中获取对象的属性?

在JavaScript/jQuery中,如果我alert有一些对象,我会得到[object]或者 [object Object]

有什么办法可以知道:

  1. 这两个对象有什么区别

  2. 这是什么类型的对象

  3. 此对象包含的所有属性以及每个属性的值

javascript jquery

93
推荐指数
3
解决办法
24万
查看次数

javascript字符串类型和字符串对象之间的区别?

我一直在搞乱ECMA-262标准(ECMAScript语言规范,第3版,如果它对此很重要 - 我没有发现第3版和第5版字符串类型/字符串对象之间有任何区别).

有一件事令我感到困惑:String Type和String Object之间的区别.是的,我知道String Type是一个16位UTF-16单元序列,而String对象是一个内置对象,其内部Class属性设置为"String",其内部Value属性设置为字符串类型的值.

但是阅读规范,字符串类型似乎没有暴露任何方法; 也就是说,它只是一个没有任何附加属性的值.拿这个代码,一切都完全符合预期:

document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'
Run Code Online (Sandbox Code Playgroud)

第一种类型是实际的String Type,第二种是Object Type(它是String类的对象,但它的数据类型是object).但是,看看这个:

"foo".charAt(0);

fooStrObj = new String("Foo");
fooStrObj.charAt(0);
Run Code Online (Sandbox Code Playgroud)

它们似乎都暴露了相同的功能,但ECMA-262标准中定义的字符串类型没有任何功能; 它公开的所有函数都来自String.prototype对象(我看不到对String Type的神奇地暴露了ECMA-262标准中String.prototype对象的所有属性和函数这一事实的引用).那么String Type类型的值是否会自动提升为String对象,并将原始String Type值作为其内部Value属性?

如果他们被完全相同(这似乎是他们所有的意图和目的),为什么有两种不同的方式来表示一个字符串

javascript

64
推荐指数
2
解决办法
1万
查看次数

为什么有两种JavaScript字符串?

这个只是刺伤了我.我不知道所有浏览器是否都是这种情况(我没有任何其他有能力的浏览器进行测试),但至少Firefox有两种字符串对象.

打开Firebugs控制台并尝试以下操作:

>>> "a"
"a"
>>> new String("a")
String { 0="a"}
Run Code Online (Sandbox Code Playgroud)

正如你可以直观地观察,Firefox的对待new String("a")"a"不同.否则,两种字符串似乎表现相同.例如,有证据表明两者都使用相同的原型对象:

>>> String.prototype.log = function() { console.log("Logged string: " + this); }
function()
>>> "hello world".log()
Logged string: hello world
>>> new String("hello world").log()
Logged string: hello world
Run Code Online (Sandbox Code Playgroud)

显然,两者都是一样的.也就是说,直到你问这种类型.

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
Run Code Online (Sandbox Code Playgroud)

我们还可以注意到,当this一个字符串时,它始终是对象形式:

>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}
Run Code Online (Sandbox Code Playgroud)

更进一步,我们可以看到非对象字符串表示不支持任何其他属性,但对象字符串执行:

>>> var a = …
Run Code Online (Sandbox Code Playgroud)

javascript string

37
推荐指数
1
解决办法
705
查看次数

JavaScript:使用没有运算符'new'的构造函数

请帮助我理解以下代码的工作原理:

<script>
    var re = RegExp('\\ba\\b') ;
    alert(re.test('a')) ;
    alert(re.test('ab')) ;
</script>
Run Code Online (Sandbox Code Playgroud)

在第一行没有new运营商.

据我所知,JavaScript中的一个构造函数是一个初始化运算符创建的对象的函数,new它们并不意味着返回任何东西.

javascript constructor new-operator object-construction

27
推荐指数
2
解决办法
5642
查看次数

Javascript的新运营商做了什么,但让生活变得困难吗?

我来自传统的Web开发人员背景,在这里我无法宣称对Javascript有任何了解,但我正在努力.

我目前对JQuery的理解是一个相当新手的理解,对闭包的理解稍微好一些,而且我已经阅读过了,并且觉得我对Douglas Crockford的"Javascript:The Good Parts"非常清楚.

我最近一直在构建一些相当javascript密集的页面,我对结果非常满意.需要注意的一点是,我设法完成了几乎没有全局函数的整个事情,甚至没有使用new运算符.

事实上,从我对上述书籍的阅读中,操作员什么也做不了你不能做的另一种更简单的方法,并迫使你破解'this'变量.

那么有什么我想念的吗?新操作符实际上是出于某种目的还是仅仅是一种让OO程序员在功能语言中感到舒适的技巧?我会更好地从我的JS词汇中完全打击它吗?

javascript

15
推荐指数
1
解决办法
4799
查看次数

字符串对象?

以下是将字符串视为对象的两个原因.首先,您可以通过以下方式创建字符串:

var mystring = new String("asdf");
Run Code Online (Sandbox Code Playgroud)

我的印象是new运算符后面的构造函数必须返回一个对象.其次,字符串似乎有属性和方法.例如:

mystring.toUpperCase();
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串是对象,那么我们期望像下面这样的东西起作用:

function string_constructor() {
    return "asdf";
}

var mystring = new string_constructor();
Run Code Online (Sandbox Code Playgroud)

但它没有,我被告知它不是因为字符串不是对象.字符串对象是否也是如此?无论哪种方式,我怎样才能理解我列出的所有内容?

javascript

10
推荐指数
1
解决办法
4088
查看次数

字符串对象与文字 - 修改原型?

我想知道为什么似乎在字符串文字的原型中添加一个方法似乎有效,但添加一个属性不是吗?我在玩这个问题的想法,并有以下代码:

String.prototype._str_index1 = 0;
String.prototype._str_reset = function() {
    this._str_index1 = 0;
};
String.prototype._str_substr = function(len) {
  var ret = this.substr(this._str_index1, len);
  this._str_index1 = this._str_index1 + len;
  return ret;
};

var testString = new String('Loremipsumdolorsitamet,consectetur');
log(testString._str_substr(5));
log(testString._str_substr(4));
?
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,如果我将第三行更改为:

var testString = 'Loremipsumdolorsitamet,consectetur';
Run Code Online (Sandbox Code Playgroud)

...似乎虽然该方法_str_substr存在且可在字符串文字上调用,但该属性的值_str_index1始终为0.

这是怎么回事?

javascript

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

JavaScript - Function核心对象的行为

据我所知,在JavaScript(Gecko变体)中:

var a = new A();
Run Code Online (Sandbox Code Playgroud)

是这样的语法糖:

var a = {};
a.__proto__ = A.prototype;
A.call(a);
Run Code Online (Sandbox Code Playgroud)

因此,A()(相当于A.call()?)和新的A()应该产生两个不同的结果,如下所示:

>>> new Date()
Fri Nov 19 2010 01:44:22 GMT+0100 (CET) {}
>>> typeof new Date()
"object"

>>> Date()
"Fri Nov 19 2010 01:44:42 GMT+0100 (CET)"
>>> typeof Date()
"string"
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

但是,核心对象的Function行为有所不同:

>>> Function('return 123;')
anonymous()
>>> typeof Function('return 123;')
"function"
>>> Function('return 123;')()
123
>>> new Function('return 123;')
anonymous()
>>> typeof new Function('return 123;')
"function"
>>> …
Run Code Online (Sandbox Code Playgroud)

javascript

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

Object.create(foo)和new Object(foo)之间的区别?

为什么这个代码:

var foo = {one: 1, two: 2};
var bar = new Object( foo );
bar.three = 3;
bar.one = 100; 
document.write(bar.one); //100 
document.write(foo.one); //100
Run Code Online (Sandbox Code Playgroud)

导致bar.one和foo.one都是100,而

var foo = {one: 1, two: 2};
var bar = Object.create( foo );
bar.three = 3;
bar.one = 100; 
document.write(bar.one); //100
document.write(foo.one); //1
Run Code Online (Sandbox Code Playgroud)

只影响bar.one ..

我的第一个直觉是,因为在第一段代码中我们正在为bar指定一个foo引用,那么它意味着更改也将适用于foo,而在第二段代码中,它可能是"从foo继承",因此更改在bar的'子类'属性赢了; t适用于它的'超类'(原型)..

有人可以确认我的假设至少是在正确的轨道上吗?绝对会欣赏任何答案.提前致谢.

javascript

4
推荐指数
1
解决办法
880
查看次数

如果字符串不是对象,我怎么能使用内置方法?

在JavaScript中创建对象时,可以从可以使用的Object原型继承属性.

但是字符串是原始类型,因此没有原型.那么,如果没有原型,字符串可以继承那些方法,我怎么能在字符串上使用substr()和repeat()等方法呢?

例如,当我创建一个新数组并将其分配给变量时,我将变量名称键入控制台,并列出了Array原型,我可以访问我可以使用的方法.但是如果我创建一个字符串并将字符串分配给变量,那么我将变量键入控制台,没有附加原型.

那有意义吗?

javascript javascript-objects

3
推荐指数
1
解决办法
47
查看次数