JavaScript你所不知道的困惑(2)
来源:互联网 发布:java开发工作经历描述 编辑:程序博客网 时间:2024/05/01 06:26
困惑一:
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;
引用类型的值是保存在内存中的对象,JavaScript不允许访问内存中的位置,也就是说不能直接操作对象的内存空间,引用类型赋值操作实际上是建立了新的引用。
困惑二:
JavaScript中是如何回收内存的?
JavaScript具有自动垃圾收集机制,不再使用的内存资源会被系统释放。具体到浏览器中的实现,通常有两个策略:
1、标记清除:
JavaScript中最常用的垃圾收集方式是标记清除。
当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”,当变量离开环境时,则将其标记为“离开环境”,则此时可回收。垃圾回收器会定时回收资源。
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,greenalert(colors.valueOf());//red,blue,greenalert(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, Gregalert(people.toString()); //Nicholas, Gregalert(people.toLocaleString()) //Nikolaos, Grigorios与前面两个方法唯一的不同在于,为了取得每一项的值,会调用每一项的toLocaleString方法,而不是toString方法。
数组继承的toLocaleString()、toString()、valueOf方法,在默认情况下都以逗号分隔,使用join()方法可以构建不同的分隔符字符串。
var colors = ["red", "green", "blue"];alert(colors.join(",")); //red,green,bluealert(colors.join("||")) //red||green||blue困惑五:
var colors = ["red", "blue"];colors.push("brown");colors[3] = "black";alert(colors.length); //4var item = colors.pop();alert(item); //"black"ECMAScript数组也提供了一种让数组的行为类似于其他数据结构的方法。数组可以像栈一样,压栈和出栈。
var colors = new Array();var count = colors.push("red", "green");alert(count); //2count = colors.push("black");alert(count); //3var 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)
- JavaScript你所不知道的困惑(1)
- JavaScript你所不知道的困惑(3)
- 你所不知道的JavaScript(一)this 关键字
- 你所不知道的JavaScript的逻辑操作符
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- 说说JavaScript的prototype(内容源自《你所不知道的JavaScript》)
- 你不知道的javascript(一)
- 你不知道的javascript(二)
- 你不知道的javascript(三)
- 你不知道的javascript(四)
- 你不知道的javascript(六)
- 你不知道的JavaScript (上)
- 你不知道的JavaScript (上)
- (更新)knockout.js学习——1.2例子——绑定的详细语法
- JavaScript 类(笔记)
- 【整理】Linux内核中的atoi,itoa等函数
- LauncherShortcuts 创建应用程序某个Activity的快捷方式
- oninput,onpropertychange,onchange的用法和区别
- JavaScript你所不知道的困惑(2)
- android 自定义webview 如何使用gps 如何用模拟的gps
- 伸展树的旋转和伸展操作
- java Servlet 监听器
- NSFileManager 方法
- 数位dp无前导零
- js前端导出excel表格
- 浏览器清浮
- 如何在PHP程序中使用FusionCharts创建JavaScript图表