JavaScript内容
尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:
目前我们学习JavaScript也就是需要学习:
JavaScript语法基础
使用JS操作网页(DOM)
使用JS操作浏览器(BOM)
注:
javascript运行必须依赖于宿主环境语言,即页面语言HTML。
是解释型的语言,解释型:不需要编译,解释器程序会每读取一条语句就执行。运行速度慢,浏览器中默认内置了javascript的解释器程序。
浏览器中默认内置了javascript的解释器程序。
(1)要特别注意相等运算符==。
JavaScript在设计时,有两种比较运算符:
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。
(2)另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:
`NaN === NaN; // false`
唯一能判断NaN的方法是通过isNaN()函数: isNaN(NaN); // true
最后要注意浮点数的相等比较: 1 / 3 === (1 - 2 / 3); // false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值: Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
(3)null和undefined
null表示一个“空”的值,它和0以及空字符串”不同,0是一个数值,”表示长度为0的字符串,而null表示“空”。
在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
(4)静态语言和动态语言
在JavaScript中,使用等号=对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次,例如:
var a = 123; // a的值是整数123
a = 'ABC'; // a变为字符串
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下:
int a = 123; // a是整数类型变量,类型用int申明
a = "ABC"; // 错误:不能把字符串赋给整型变量
和静态语言相比,动态语言更灵活,就是这个原因。
(5)strict模式
'use strict';
使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内。
(6)模板字符串
如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量:
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
(7)字符串不可变
字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
var s = 'Test';
s[0] = 'X';
alert(s); // s仍然为'Test'
函数的定义格式:
function 函数名(形参列表){
函数体 ;
}
(8)javascript的函数要注意的细节:
1. 在 javascript中函数 定义形参时是不能使用var关键字声明变量 的。
2. 在javascript中 的函数是没有 返回值类型 的,如果函数需要返回数据给调用者,直接返回即可,如果不需要返回则不返回。
3. 在 javascript中是没有函数重载的概念的,后定义的同名函数会直接覆盖前面定义同名函数。
4. 在javascript中任何的函数内部都隐式的维护了一个arguments(数组)的对象,给函数 传递数据的时候,是会先传递到arguments对象中,然后再由arguments对象分配数据给形参的。
需求:定义一个函数做两个参数的加法功能。
*/
function add(a,b){
var sum = a+b;
document.write("两个参数的总和:"+ sum);
//return sum;
}
function add(){
document.write("长度:"+arguments.length+"<br/>");
for(var index = 0 ; index<arguments.length ; index++){
document.write(arguments[index]+",");
}
//var sum = a+b+c;
//var sum = 0;
//document.write("三个参数的总和:"+ sum);
}
//调用函数
add(11,21,13,14);
自定义对象:
在javascript没有类的概念,只要有函数即可创建对象。
自定义对象的方式1: 使用无参的函数创建对象。
例子:
function Person(){}
var p = new Person(); //创建了一个Person对象了
p.id = 110;
p.name = "狗娃";
方式2:使用带参的函数创建对象。
function Person(id,name){
this.id = id;
this.name = name;
this.say = function(){
alert(name+"呵呵");
}
}
var p = new Person(110,"狗剩"); //创建对象
方式3: 使用Object函数创建对象
var p = new Object();
p.id = 110;
p.name = "铁蛋";
方式4:使用字面量的方式创建.
var p = {
id:110,
name:"狗娃",
say:function(){
alert(this.name+"呵呵");
}
}
Prototype的使用
<script type="text/javascript">
//把方法添加到数组对象
Array.prototype.getMax=function(){
var max=this[0];
for(var i=0;i<this.length;i++){
if(max<this[i]){
max=this[i]
}
}
return max;
}
Array.prototype.getIndex=function(target){
for(var i=0;i<this.length;i++){
if(this[i]==target){
return i;
}
}
return -1;
}
var arr=new Array(12,34,6,3,62,32);
var max=arr.getMax();
var index=arr.getIndex(6);
document.write("max="+max+"<br/>");
document.write("index="+index+"<br/>");
</script>