Javascript变量的注重要点

ECMAScript 变量能够包括两种差别数据范例的值:基础范例值和援用范例值。

基础范例和援用范例的值

基础范例值(String,Number,Boolean,Null,Undefined)指的是简朴的数据段;援用范例值(保留在内存中的对象)指的是那些能够由多个值组成的对象。5种基础范例值的议论见 JavaScript数据范例的一些注重要点
值得注重的是,许多语言中,字符串以对象的情势来示意。但在ECMAScript 中则摒弃了这一点。

动态的属性

动态的属性:动态地为援用范例值增加属性。关于援用范例的值,可认为其增加、转变和删除属性和要领。如:

var persons = new Object();
persons.name = "Oliver";
document.write(persons.name); //"Oliver"

在上面这个例子中,变量persons 贮存了一个对象。persons 就是变量,name 就是属性,“Oliver”就是赋值给persons.name 的一般字符串。最后又经由过程document.write 访问了这个name 属性。假如对象不被烧毁或许这个属性不被删除,则这个属性将一向存在。

然则,我们不能给基础范例的值增加属性,只管如许做不会致使任何毛病。如:

var name = "Oliver";
name.age = 18;
document.write(name.age); //undefined

所以说,只能用援用范例值动态地增加属性。

复制变量值

复制变量值:从一个变量向另一个变量复制基础范例值和援用范例值。

复制基础范例值

异常简朴,如:

var x = 1;
var y = x;
document.write(y); //1

supereasy 在这里,复制以后,x 和y 完整自力,互不影响。

复制援用范例值

当从一个变量向另一个变量复制援用范例的值时。与基础范例值差别的是,这个值的副本现实上是一个指针,而这个指针指向存储在堆中的一个对象。如:

var persons = new Object();
persons.name = "Oliver";
var child = persons;
document.write(child.name); //"Oliver"

复制操纵终了后,两个变量现实大将援用同一个对象。转变个中一个变量,就会影响另一个变量。

通报参数

通报参数:函数外部的值复制给函数内部的参数。现实上,就跟把值从一个变量复制到另一个变量一样。该怎样操纵怎样操纵。

向参数通报基础范例的值(参数是按值通报的,复制给部分变量)

向参数通报基础范例的值时,被通报的值会被复制给一个部分变量。如:

function add(x){
    x = x + 10;
    return x;
}
var num = 1;
document.write(num); //1
var result = add(num);
document.write(result); //11

很明显能够看到,x 现实上是函数的部分变量。挪用这个变量时,num 作为参数被通报给函数,这个变量的值是1。在函数内部,x 被加上了10 但这病不影响外部的num。

简朴的说就是,num 复制给参数x,x 在函数内部是部分变量,不管x 怎样变化,都不影响num 的变化。*

向参数通报援用范例的值(参数是按值通报的,通报地点)

向参数通报援用范例的值时,会把这个值在内存中的地点复制给一个部分变量,因此在这个部分变量的变化会反应在函数的外部。如:

function set(obj){
    obj.name = "Oliver";
}
var persons = new Object();
set(persons);
document.write(persons.name); //"Oliver"

然则

然则

然则

肯定要注重的是参数不!是!按!引!用!传!递!的!

看下面这个例子:


function set(obj){
    obj.name = "Oliver";
    obj = new Object();
    obj.name = "Troy"
    document.write(obj.name); //"Troy"
}
var persons = new Object();
set(persons);
document.write(persons.name); //"Oliver"

上面这个申明了当函数内部重写obj 时,这个变量援用的就是一个部分对象了。而这个部分对象会在函数实行终了后立即被烧毁!!这也是为何函数内部返回了obj.name 的值是”Troy”;函数外部返回了obj.name 的值则是”Oliver”的缘由了。

所以说,虽然部分作用域中修正的对象会在全局作用域中反应出来,但仍然不能申明参数是按援用通报的。

所以照样那句话,肯定要注重

参数不!是!按!引!用!传!递!的!

检测范例

毋庸置疑,检测基础数据范例时,最好的东西是typeof操纵符。如:

var a = "abc";
var b = true;
var c = 21;
var d = null;
var e;
var f = new Object();
document.write(typeof a + "<br/>"); //string
document.write(typeof b + "<br/>"); //boolean
document.write(typeof c + "<br/>"); //number
document.write(typeof d + "<br/>"); //object
document.write(typeof e + "<br/>"); //undefined
document.write(typeof f + "<br/>"); //object

而检测援用范例的值时,最好的东西是instanceof操纵符。如:

var array = new Array;
document.write(array instanceof Array); //true;
var obj = new Object();
document.write(obj instanceof Array); //false;
document.write(obj instanceof Object); //true;

语法是:


result = variable instanceof constructor

一切援用范例的值都是Object 的实例。因此在检测一个援用范例值和Object 组织的函数时,instanceof 操纵符始终会返回true。

    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000003976041
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞