【JavaScript】基础应用
重新声明变量
如果重新声明 JavaScript 变量,该变量的值不会丢失。在以下两条语句执行后,变量 carname 的值依然是 "Volvo":
<script> var carname="Volvo"; var carname; </script>
向未声明的变量分配值
如果把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。这条语句:carname="Volvo";将声明 window 的一个属性 carname。
非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。(严格模式:"use strict";)
<script> var var1 = 1; // 不可配置全局属性 var2 = 2; // 没有使用 var 声明,可配置全局属性 console.log(this.var1); // 1 console.log(window.var1); // 1 console.log(window.var2); // 2 delete var1; // false 无法删除 console.log(var1); //1 delete var2; console.log(delete var2); // true console.log(var2); // 已经删除 报错变量未定义 </script>
全局变量
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。以下实例中 carName 在函数内,但是为全局变量。全局变量是 window 对象,所有数据变量都属于 window 对象
<script> // 此处可调用 carName 变量,可使用 window.carName function myFunction() { carName = "Volvo"; // 此处可调用 carName 变量 } </script>
全局变量,或者函数,可以覆盖 window 对象的变量或者函数。局部变量,包括 window 对象可以覆盖全局变量和函数。
变量生命周期
JavaScript 变量生命周期在它声明时初始化;局部变量在函数执行完毕后销毁;全局变量在页面关闭后销毁。
字符串可以是对象
通常, JavaScript 字符串是原始值,可以使用字符创建: var firstName = "John";但我们也可以使用 new 关键字将字符串定义为一个对象: var firstName = new String("John")
var x = "John"; var y = new String("John"); typeof x // 返回 String typeof y // 返回 Object
var x = "John"; var y = new String("John"); (x === y) // 结果为 false,因为 x 是字符串,y 是对象 //=== 为绝对相等,即数据类型与值都必须相等
typeof和instanceof用法:
typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:number,boolean,string,function(函数),object(NULL,数组,对象),undefined。如:
typeof "John" // 返回 string typeof 3.14 // 返回 number typeof NaN // 返回 number typeof false // 返回 boolean typeof [1,2,3,4] // 返回 object typeof {name:'John', age:34} // 返回 object typeof new Date() // 返回 object typeof function () {} // 返回 function typeof myCar // 返回 undefined (如果 myCar 没有声明) typeof null // 返回 object
我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错。正因为typeof遇到null、数组、对象时都会返回object类型,所以当我们要判断一个对象是否是数组时或者判断某个变量是否是某个对象的实例则要选择使用另一个关键语法instanceof,instanceof用于判断一个变量是否某个对象的实例。如:
var a=new Array(); alert(a instanceof Array); //返回true alert(a instanceof Object) //也会返回true;这是因为Array是object的子类。 function test(){}; var a=new test(); alert(a instanceof test) // 返回true。 console.log(true instanceof Boolean); //返回false console.log(new Boolean(true) instanceof Boolean); //返回true
数组中使用名字来索引
许多程序语言都允许使用名字来作为数组的索引。使用名字来作为索引的数组称为关联数组(或哈希)。JavaScript 不支持使用名字来索引数组,只允许使用数字索引。
var person = []; person[0] = "John"; person[1] = "Doe"; person[2] = 46; var x = person.length; // person.length 返回 3 var y = person[0]; // person[0] 返回 "John"
在 JavaScript 中,对象 使用 名字作为索引。如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。执行这样操作后,数组的方法及属性将不能再使用,否则会产生错误:
var person = []; person["firstName"] = "John"; person["lastName"] = "Doe"; person["age"] = 46; var x = person.length; // person.length 返回 0 var y = person[0]; // person[0] 返回 undefined
Undefined 不是 Null
在 JavaScript 中,null 用于对象,undefined 用于变量、属性和方法。对象只有被定义才有可能为 null,否则为 undefined。如果我们想测试对象是否存在,在对象还没定义时将会抛出一个错误。
//错误使用方式 if (myObj !== null && typeof myObj !== "undefined") //报错:myObj is not defined //正确使用方式:先使用typeof来检测对象是否已定义 if (typeof myObj !== "undefined" && myObj !== null)