困惑一:

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "阳光小强";
alert(obj2.name); //输出结果:阳光小强

JavaScript中的5个基本类型:Undefined、Null、Boolean、Number和String都是按值訪问的。能够操作保存在变量中的实际的值,内存空间例如以下:

var num1 = 5;
var num2 = num1;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

引用类型的值是保存在内存中的对象,JavaScript不同意訪问内存中的位置,也就是说不能直接操作对象的内存空间,引用类型赋值操作实际上是建立了新的引用。

困惑二:

JavaScript中是怎样回收内存的?

JavaScript具有自己主动垃圾收集机制,不再使用的内存资源会被系统释放。详细到浏览器中的实现。通常有两个策略:

1、标记清除:

JavaScript中最经常使用的垃圾收集方式是标记清除。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

当变量进入环境(比如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。当变量离开环境时。则将其标记为“离开环境”,则此时可回收。

垃圾回收器会定时回收资源。

2、引用计数:

还有一种不太常见的垃圾收集策略叫引用计数。

跟踪记录每一个值被引用的次数,当这个值的应用次数变成0时,就会释放。

IE中有一部分对象并非原生的JavaScript对象。BOM和DOM中的对象就是使用C++以COM(组件对象模型)对象的形式实现的,而COM对象的垃圾回收机制採用的就是引用计数策略,这样会存在循环引用问题。

var element = document.getElementById("som_element");
var myObject = new Object();
myObject.element = element;
element.someOject = myObject;

为了解决上述问题。IE9把BOM和DOM对象都转换成了真正的JavaScript对象。

困惑三:

var colors = ["red", "blue", "green"];
colors.length = 2;
alert(colors[2]); //输出: undefined

数组的length属性不是仅仅读的,能够设置该属性,从数组末尾移除项。

困惑四:

var colors = ["red", "blue", "green"];
alert(colors.toString()); //red,blue,green
alert(colors.valueOf()); //red,blue,green
alert(colors); //red,blue,green

alert()方法接收的是一个字符串,为了创建字符串会调用每一项的toString方法。

另外,toLocaleString()方法经常也会返回与toString()和valueOf()方法相同的值。但也不是总是如此。

var person1 = {
toLocaleString : function(){
return "Nikolaos";
},
toString : function(){
return "Nicholas";
}
}; var person2 = {
toLocaleString : function(){
return "Grigorios";
},
toString : function(){
return "Greg";
}
}; var people = [person1, person2];
alert(people); //Nicholas, Greg
alert(people.toString()); //Nicholas, Greg
alert(people.toLocaleString()) //Nikolaos, Grigorios

与前面两个方法唯一的不同在于,为了取得每一项的值,会调用每一项的toLocaleString方法,而不是toString方法。

数组继承的toLocaleString()、toString()、valueOf方法,在默认情况下都以逗号分隔,使用join()方法能够构建不同的分隔符字符串。

var colors = ["red", "green", "blue"];
alert(colors.join(",")); //red,green,blue
alert(colors.join("||")) //red||green||blue

困惑五:

var colors = ["red", "blue"];
colors.push("brown");
colors[3] = "black";
alert(colors.length); //4 var item = colors.pop();
alert(item); //"black"

ECMAScript数组也提供了一种让数组的行为相似于其它数据结构的方法。数组能够像栈一样,压栈和出栈。

var colors = new Array();
var count = colors.push("red", "green");
alert(count); //2 count = colors.push("black");
alert(count); //3 var item = colors.pop();
alert(item); //"black"
alert(colors.length); //2

能够将栈方法和数组方法连用。

相同也支持队列数据结构的訪问规则,例如以下:

var colors = new Array();
var count = colors.push("red", "green");
alert(count); count = colors.push("black");
alert(count); var item = colors.shift();
alert(item); //"red"
alert(colors.length); //2

困惑六:

alert(sum(10, 10));
function sum(num1, num2){
return num1 + num2;
}

上面代码能够运行。运行结果为20。将上面代码略微改动一下。例如以下:

alert(sum(10, 10));
var sum = function (num1, num2){
return num1 + num2;
}

不能运行,错误: undefined is not a function

解析器会领先读取函数声明。并使其在运行不论什么代码之前可用(能够訪问)。上面第二个样例不能运行的原因是函数位于一个初始化语句中,而不是一个函数声明。

JavaScript你所不知道的困惑(2)的更多相关文章

  1. JavaScript你所不知道的困惑(1)

    困惑一: 先看一个样例: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi&quo ...

  2. JavaScript你所不知道的困惑(3)

    版权声明:本文出自水寒的原创文章.未经博主同意不得转载. https://blog.csdn.net/lxq_xsyu/article/details/25600011 困惑一: window.col ...

  3. JavaScript中你所不知道的Object(二)--Function篇

    上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...

  4. js值----你所不知道的JavaScript系列(6)

    1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...

  5. js类型----你所不知道的JavaScript系列(5)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...

  6. 闭包----你所不知道的JavaScript系列(4)

    一.闭包是什么? · 闭包就是可以使得函数外部的对象能够获取函数内部的信息. · 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. · 闭包就 ...

  7. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  8. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  9. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

随机推荐

  1. React中css的使用

    网页的布局.颜色.形状等UI展示方式主要是由Css进行设置,在ReactJs中也是一样.ReactJs中的Css结构方式与传统的Web网页类似,但依然存在一些差异.ReactJs中Css文件本身的编写 ...

  2. skkyk:题解 洛谷P3865 【【模板】ST表】

    我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你 ...

  3. java foreach的实现原理

    http://blog.csdn.net/moqihao/article/details/51078464 本质是通过集合的iterator方式实现,所以再使用foreach集合,要强制判断集合的是否 ...

  4. 详解Java类的生命周期

    引言 最近有位细心的朋友在阅读笔者的文章时,对Java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内Java方面的教材大多只是告 ...

  5. python--getitem一拦截索引运算

    getitem一拦截索引运算 __getitem__方法拦截实例的索引运算.当实例x出现在x[i]这样的索引运算中时,Python会调用这个实例继承的__getitem__方法(如果有的话),把x作为 ...

  6. LCA+主席树 (求树上路径点权第k大)

      SPOJ 10628. Count on a tree (树上第k大,LCA+主席树) 10628. Count on a tree Problem code: COT You are given ...

  7. 【Go】错误处理

    · error类型是一个接口类型,也是一个Go语言的内建类型.在这个接口类型的声明中只包含了一个方法Error.这个方法不接受任何参数,但是会返回一个string类型的结果.它的作用是返回错误信息的字 ...

  8. Codeforces787D - Legacy

    Description \(n(n\leq10^5)\)个点构成的有向图,有\(m(m\leq10^5)\)条连通信息,信息有三种: 1 u v w,表示存在一条边权为\(w\)的有向边\((u,v) ...

  9. 【2018.10.2】Note of CXM

    1.有一张无向图,现在要给每个点染上黑色或白色,最后每个点的染色代价是它与离这个点最近的不同色节点的距离.求最小代价.所有边权$\geq 0$且互不相同. 分三种情况: 两点都染了色:两点都跟其它点算 ...

  10. 转载: LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”的原因又一例

    转载地址:http://blog.csdn.net/mxclxp/article/details/8196142 LINK : fatal error LNK1104: 无法打开文件“mfc71.li ...