一.js的基础部分
1.==和===的区别:==在判断是否相等的时候会进行类型转换,有时会得到非常奇怪的结果,因此一般情况下都是用===判断是否相等
2.strict模式:在js中,如果一个变量没有用var进行声明,那么这个变量将会变成全局变量.采用strict模式声明后,如果该变量没有用var声明,那么将会报错!采用strict模式的方法是在js的第一行加上:
'use strict';
3.多行字符串的表示:由于多行字符串用
写起来比较费事.最近的ES6标准新增了一种多行字符串的表示方法,例如:
alert('这是一个
多行
字符串');这样就可以输出多行字符串了.
4.字符串获取某个字符,var s='hello world';s[0]可以获取到字符.字符串不会发生变化,但是用s[0]赋值也不会发生错误.字符串的常用方法:(调用这些方法不会改变原有字符串的内容而是会返回一个新的字符串)
1>.toUpperCase
2>.toLowerCase
3>.indexOf
4>.subString
5.javascript数组可以包含任意数据类型,并且通过索引来访问每一个元素
6.js的数组是可以随意改变大小的,要取得数组的长度,可以采用array.length属性来获取.直接给array.length赋值将会导致数组产生变化:
var arr=[1,'aa']; arr.length=6; //-->arr:[1,'aa',undefined,undefined,undefined,undefined] var brr=[1,'bb'] brr[4]='cc'; //-->brr:[1,'bb',undefined,undefined,'cc']
7.javascript访问对象不存在的属性将不会报错,而会返回undefined.
var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', height: 1.70, weight: 65, score: null }; alert(xiaoming.friend); //undefined
8.js的属性是动态的,因此可以随意给js对象添加任意的属性.
var xiaoming = { name: '小明' }; xiaoming.age; // undefined xiaoming.age = 18; // 新增一个age属性 xiaoming.age; // 18 delete xiaoming.age; // 删除age属性 xiaoming.age; // undefined delete xiaoming['name']; // 删除name属性 xiaoming.name; // undefined delete xiaoming.school; // 删除一个不存在的school属性也不会报错
如果要检测某个对象是否有某个属性,可以用in 操作符
var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', height: 1.70, weight: 65, score: null }; 'name' in xiaoming; // true 'grade' in xiaoming; // false
9.for in循环:
可以把对象的属性依次遍历出来,效果如下:
var obj={ name:'胡龙海', age:23, sex:'male' }; for(var key in obj) { alert(obj[key]);//把一个对象所有的属性名称给遍历出来,'胡龙海',23,'male' alert(key); //把属性名遍历出来.name,age,sex }
由于数组也是对象,当用for in遍历数组的时候,遍历得到的是数组的索引.代码如下(注意for in对于Array的循环遍历得到的是String而不是number.:
var a = ['A', 'B', 'C']; for (var i in a) { alert(i); // '0', '1', '2' alert(a[i]); // 'A', 'B', 'C' }
10.undefined判断的是变量的类型,而其他两个判断是变量的值。
undefined可以用来表示以下的状况:
1. 表示一个未声明的变量,
2. 已声明但没有赋值的变量,
3. 一个并不存在的对象属性
null 是一种特殊的object ,表示无值;
NaN是一种特殊的number ,表示无值;
下面的代码输出NAN(undefined与number类型做操作,最后得到的结果是NAN(特殊的数字,表示无值))
var x; alert(-x);
11.function参数列表中传入任意的参数都可以,其中只有在函数中声明的参数会被参与函数运算,而没有被声明的参数会被自动忽略.例如假设一个函数的参数列表有2个,而传入了4个变量,则后面2个变量会被自动忽略.
12.js的变量提升:它会扫描整个函数的语句,并且将所有声明的变量提升到函数的顶部.例如下面的代码的输出将是一个很好的例子:
function foo() { var x='嘻嘻'; alert(x+y); var y=2;//这里对于变量y的声明将会被提升到函数体顶部,但是却没有给y赋值,因此输出嘻嘻undefined }
这个函数相当于下面的函数:
function foo1() { var x='嘻嘻'; var y; alert(x+y); y=2; }
20.js的全局变量是声明在函数外的,实际上javascript有一个全局对象window,而全局变量实际上是绑定在window对象上的属性,同时,函数也是全局变量,例如var f=function() {},声明了一个名字叫做f的全局变量.同时也可以通过window.f来调用函数.而实际上alert函数也是window的一个属性,下面的代码说出了这一点:
window.alert('调用window.alert()'); // 把alert保存到另一个变量: var old_alert = window.alert; // 给alert赋一个新函数: window.alert = function () {} alert('无法用alert()显示了!');//无输出 // 恢复alert: window.alert = old_alert; alert('又可以用alert()了!');
22.局部变量的函数作用域
注意:js和Java不同的是javascript的变量作用域实际上是函数内部,而我们在for循环的语句块中是无法定义具有局部作用域的变量的:
<script type="text/javascript"> document.getElementById("bt").onclick=function foo() { for(var i=0;i<5;i++) { } alert(i);//输出5 } </script>
23.包装对象:new Number,new Boolean,new String能把相应的基本类型转化为相应的对象.而这三个包装方法不加new的时候,此时这三个包装方法会被当作普通函数,把任何其他数据类型的数转化为number,boolean,string.