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

困惑一:

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,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),布布扣,bubuko.com

时间: 2024-10-03 03:34:25

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

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

困惑一: 先看一个例子: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi" 在函数内部使用var定义的变量是局部变量,省略var操作符的变量是全局变量. 困惑二: alert(undefined == null) 结果是"true" 我们知道在js中分为基本类型和引用类型,基本类型包括number.string.boolean.undefined.null.

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

困惑一: window.color = "red"; var o = {color: "blue"}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue call方法能扩充函数作用域,每个函数都包含两个非继承而来的方法:apply()和c

你所不知道的JavaScript数组

你所不知道的JavaScript数组 相信每一个 javascript 学习者,都会去了解 JS 的各种基本数据类型,数组就是数据的组合,这是一个很基本也十分简单的概念,他的内容没多少,学好它也不是件难事情.但是本文着重要介绍的并不是我们往常看到的 Array,而是 ArrayBuffer. 我写的很多东西都是因为要完成某些特定的功能而刻意总结的,可以算是备忘,本文也是如此!前段时间一直在研究 Web Audio API 以及语音通信相关的知识,内容侧重于音频流在 AudioContext 各个

【javascript杂谈】你所不知道的replace函数

原文:[javascript杂谈]你所不知道的replace函数 前言 最近在做面试题的时候总会用到这个函数,这个函数总是和正则表达式联系到一起,并且效果很是不错,总能很简单出色的完成字符串的实际问题,大家肯定都会使用这个函数,像我一样的初学者可能对这个函数的了解还是不够深的,今天就总结一下,了解一下,再做几道网上的题目练练手,给将要面试的同学打打气. 介绍 使用一个替换值替换掉一个替换模式在原字符串中一个或所有的匹配项,并返回替换后的字符串,这个替换模式可以是字符串或者正则表达式,替换值可以是

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

上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.String.Function等有更多的内部属性,而它们分别是什么呢? 这些内部属性不能像Object的内部属性一样一言以蔽之,因为它们各有各的用处和特点.其中核心的部分自然是最特殊的对象,Function对象.我们先从简单的开始: [[PrimitiveValue]]: 值的类型是基础数据类型.所以所有

你所不知道的 URL

0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的时候,没有对URL进行encodeURI.产品:啊咧咧?我问问看? 第二幕 大叔:翔逼你给我过来!翔逼:啊咧咧?怎么了大叔?大叔:知道在URL中的+有时候会变成什么吗?翔逼:啊咧咧?不是+吗?大叔:知道在URL中的空格有时候会变成什么吗?翔逼:啊咧咧?不是空格吗?大叔:还不赶快自己去查查看!别也成了

你所不知道的html5与html中的那些事(五)——web图像

文章简介: 现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢?     下面看看今天我为大家带来了哪些关于web图像的你所平时不一定关心的事与一些有建设性的建议吧: 1)关于web页面中的图像你需要关注的关键点有那些? 2)web页面中图像的格式选择需要注意什么? 3)<img>标签的用法细节小结?   第一个问题 关于web页面中的图像你需要关注的关键点有那些?  示例图 像示例图中的图片一样,平时我们写页面都会用

你所不知道的JSON.stringify

译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? 原文: What you didn't know about JSON.Stringify 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. JSON已经逐渐替代XML被全世界的开发者广泛使用.本文深入讲解JavaScript中使用JSON.stringify的一些细节问题.首先简单回顾一下JSON和JavaScript: 不是所有的合法

你所不知道的html5与html中的那些事(二)

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些