我正在寻找一些很好的综合阅读材料,当Javascript按值传递某些内容时,以及何时通过引用和修改传递的项目时会影响函数外部的值,何时不会.我还对通过引用与值分配另一个变量以及是否遵循任何不同的规则而不是作为函数参数传递感兴趣.
我已经做了很多搜索并找到了很多具体的例子(其中很多都是在SO上),我可以从中开始拼凑出真正的规则,但我还没有找到一个单一的,写得很好的文档,描述了这一切.
此外,语言中是否有方法可以控制是通过引用还是通过值传递某些内容?
以下是我想要了解的一些问题类型.这些只是示例 - 我实际上是在了解语言所遵循的规则,而不仅仅是具体示例的答案.但是,这里有一些例子:
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
Run Code Online (Sandbox Code Playgroud)
对于所有不同类型,x,y和z的内容何时在f的范围之外变化?
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: …Run Code Online (Sandbox Code Playgroud) 发生在我身上的一个问题是,javascript中的不同数据类型有多少内存使用.例如,在C++数据类型中,如int,char,float使用2,1,8字节的内存顺序.现在数据类型像数字,字符串,布尔值,空,undefind和对象,javascript中的数组使用多少内存以及接受的范围是多少?接受我的道歉,因为我的英语水平低!
所以我是我大学班级的助教,我对如何为绝对初学者程序员提供数据类型有一些分歧(其中大多数从未编程过).我的老师告诉学生他们必须严格使用构造函数来创建原始数据类型,如数字和字符串,她的理由是将JavaScript视为强类型,这样学生将习惯于未来的语言.我理解为什么,但我认为它有不好的权衡.
var num = new Number(10); // This is encouraged.
var num = 10; // This is discouraged (students will lose points for doing this).
Run Code Online (Sandbox Code Playgroud)
我的导师没有对这些进行区分,并且学生被告知将他们视为原始的数字,弦乐等等.虽然我相信至少对于那些datatype.valueOf()在必要时不知道更好使用的初学者,并且不知道到目前为止还有什么东西.文字符号(并且我认为它)更合适和更标准,另一种方式会引起混淆.由于构造函数符号存在一致性问题,因为它们是对象(我不希望学生担心这一点).例如,这些对初学者没有意义:
var num1 = new Number(1);
var num2 = new Number(1);
if(num1 === num2) ... ; // Does not run.
if(num1 == num2) ... ; // Does not run.
if(num1 == 1) ... ; // But this does.
var num2 = new Number(2);
if(num1 < num2) ... ; // So does this.
switch(num1){ …Run Code Online (Sandbox Code Playgroud) 我正在玩Chrome控制台并注意到一些我无法理解的东西.我知道JS变量是按值复制的,对象是通过引用复制的.下面的代码工作正常,输出2并证明JS对象作为参考:
var objA = {a: 1};
var objB = objA;
objA.a = 2;
objB.a; // 2
Run Code Online (Sandbox Code Playgroud)
但是,此代码无法正常工作.我期望objB.a输出,2但它给出了1.为什么?
var objA = {a: 1};
var objB = objA;
objA = {a: 2}; //Assigned whole object here instead property.
objB.a; //1 - Shouldn't this be 2 ??
Run Code Online (Sandbox Code Playgroud) 什么决定了JS中的存储类型?它与原始类型与引用类型有什么关系吗?
我来自 C++/python 背景。阅读这个问题的答案和评论,我遇到了一些相互不兼容(甚至内部不一致)的陈述:
从接受的答案:
Primitive values是存储在堆栈上的数据。Primitive value直接存储在变量访问的位置。Reference values是存储在堆中的对象。Reference value存储在变量 location 中的是指向存储对象的内存位置的指针。
从评论来看:
值是存储在堆栈上还是堆上并不由它们在 JS 中的类型决定。它取决于存储它的变量的生命周期(受范围,尤其是闭包的影响,并取决于引擎的分析能力)。
来自投票最高的答案:
JavaScript 没有堆栈或堆。它是一种动态语言,JavaScript 中的所有变量都是动态的。[...] JavaScript 中的所有值(原语和对象)都是从堆中分配的。甚至变量本身也是从堆中分配的。
有人可以澄清或向我推荐技术上正确的解释吗?如果该方法依赖于实现,我会很感激参考实现中的差异。
我有以下代码:
function Rune(){
this.subSpells = [];
}
function Modifier(){
this.type = "modifier";
}
Modifier.prototype = new Rune();
function RuneFactory(effect, inheritsFrom, initialValue){
var toReturn = function(){};
toReturn.prototype = new inheritsFrom();
toReturn.prototype.subSpells[effect] = initialValue;
return toReturn;
}
Duration = RuneFactory("duration", Modifier, 1);
Quicken = RuneFactory("quicken", Modifier, 1);
x = new Duration();
y = new Quicken();
Run Code Online (Sandbox Code Playgroud)
x.subSpells.duration和x.subSpells.quicken都等于1.与y相同.我希望x.subSpells.quicken和y.subSpells.duration未定义.
如果我为Duration和Quicken定义执行以下操作,我会得到我想要的行为.
Duration = RuneFactory("duration", Rune, 1);
Quicken = RuneFactory("quicken", Rune, 1);
Run Code Online (Sandbox Code Playgroud)
我认为双重继承存在问题.任何人都可以告诉我如何更改我的RuneFactory代码,使其适用于双重继承和/或解释什么是破坏?如果可能的话,我想避免使用框架.
谢谢!
我正在阅读这篇关于jQuery如何工作的 文章,并且该文章将jquery结构缩小为符号代码:
/*1*/ var jQuery = (function ()
/*2*/ {
/*3*/
/*4*/
/*5*/ var jQuery = function (selector, context)
/*6*/ {
/*7*/
/*8*/
/*9*/ return new jQuery.fn.init(selector, context, rootjQuery);
/*10*/ },
/*11*/ rootjQuery;
/*12*/
/*13*/
/*14*/ jQuery.fn = jQuery.prototype = {
/*15*/ constructor: jQuery,
/*16*/ init: function (selector, context, rootjQuery)
/*17*/ {
/*18*/
/*19*/ if (!selector)
/*20*/ {
/*21*/ return this;
/*22*/ }
/*23*/ },
/*24*/ //I screwed with the core!
/*25*/
/*26*/ yo: function ()
/*27*/ {
/*28*/ …Run Code Online (Sandbox Code Playgroud) 根据我的理解: - 原型类型测试是否相等
'lol' === 'lol'
true
Run Code Online (Sandbox Code Playgroud)
是的,因为内容是相同或真实的,因为内存中的对象ID是相同的?
- 用于身份的复合类型测试
[1,2,3] === [1,2,3]
false
Run Code Online (Sandbox Code Playgroud)
是因为引用变量是diff或diff,因为内存中的对象ID是diff?
我希望能够区分:
A)引用变量
B)标识符(命名空间)
C)内存中的实际对象
D)ID
是否有命令允许我单独测试这些东西?