JavaScript 入门
¶基础
JavaScript数据类型:字符串、数字、布尔、数组、对象、Null、Undefined
贴一个样例
<!DOCTYPE html> // 指明文件类型
<html>
<body>
<script> //标签,放在html中表示此段为JavaScript
function changeImage() {//函数
element=document.getElementById('myimage')
if (element.src.match("bulbon"))
{
element.src="/i/eg_bulboff.gif";
}
else
{
element.src="/i/eg_bulbon.gif";
}
}
</script>
<img id="myimage" onclick="changeImage()" src="/i/eg_bulboff.gif"> //其中的id,onclick等为属性配置
</body>
</html>
¶变量
JavaScript 变量均为对象。当您声明一个变量时,就创建了一个新的对象。
变量名:以字母开头,也可以是$和_开头,大小写敏感
变量声明的三种方式:
- const 不可修改,必须初始化
- var 如果您把值赋给尚未声明的变量,该变量将被自动作为全局变量声明。
- let 开头必须使用
"use strict";
块作用域(只在{}内可用),不存在变量提升,同一块作用域不能重复定义
'use strict';
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
{
var varTest = 'varTest changed.';
let letTest = 'letTest changed.';
}
console.log(varTest); //输出"varTest changed.",内部"{}"中声明的varTest变量覆盖外部的letTest声明
console.log(letTest); //输出"test let OK.",内部"{}"中声明的letTest和外部的letTest不是同一个变量
}());
¶对象
ECMAScript 中只存在一种作用域 - 公用作用域,所有属性和方法默认都是公用的!
创建对象 var person={firstname:"Bill", lastname:"Gates", id:5566};
两种寻址方式:
name=person.lastname;
name=person["lastname"];
**ECMAScript中本地的对象都是从object 继承过来的,**可以通过对object的原型添加新的方法,使得本地对象都具有此方法
Object.prototype.valueof=function(){
alert(this.valueof());
}
var num=15;
num.valueof();//输出15
¶原型 (prototype)
¶原型方式的问题
function Car() {
}
Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.drivers = new Array("Mike","John");
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John,Bill"
上面的代码中,属性 drivers 是指向 Array 对象的指针,
该数组中包含两个名字 “Mike” 和 “John”。
由于 drivers 是引用值,Car 的两个实例都指向同一个数组。
¶构造函数与原型混合
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
}
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John"
所有的非函数属性都在构造函数中创建,意味着又能够用构造函数的参数赋予属性默认值了。
因为只创建 showColor() 函数的一个实例,所以没有内存浪费
¶动态原型
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
if (typeof Car._initialized == "undefined") { //重点,typeof为变量类型判断
Car.prototype.showColor = function() {
alert(this.color);
};
Car._initialized = true;
}
}
¶数组
var cars=new Array("Audi","BMW","Volvo");
var cars=new Array();
cars[0]="Audi";
cars[1]="BMW";
cars[2]="Volvo";
var cars=["Audi","BMW","Volvo"];
¶函数
关键词 function 必须是小写的
function functionname()
{
这里是要执行的代码
}
¶变量提升
js会将变量全都提升在函数的顶部
function example(){
var x=9+y;
console.log(x);//结果 :9,undefined
var y="hello";
}
此时输出因为变量都被"提升",所以输出y不会判错,但y是在其后被赋值,所以为undefined
可以理解为
funciton example(){
var x=9+y;
console.log(x);
y="hello";
}
¶参数调用与全局变量
var color="blue";
function changecolor(color){
console.log(color);//undefined
if(color=="blue"){ color="red"; }
else{ color="green"; }
console.log(color);//green
}
changecolor();
//changecolor(color);
console.log(color);//blue
搜寻参数的机制:
first local then global,如果local没找到则到global中找。
如果函数parameter中没有定义color,函数中使用的color的值就是从global获取的“blue”;
如果函数parameter中定义了color,这就相当于新建了一个local变量,在怪兽兄例子中,
该parameter is initialized, but hasn’t been assigned a value, 此时color的值是undefined
¶模拟函数重载
由于javascript中并没有函数重载,可以利用arguments进行模拟函数重载
通过调用arguments中的length函数去判断参数个数进行”重载“
function method(){
switch(arguments.length){
case 0:
alert(0);
break;
case 1:
alert(arguments[0]*10);//参数调用,从0开始计数
break;
case 2:
alert(arguments[0]+arguments[1]);
break;
default:
break;
}
¶闭包
闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。
¶残枝碎叶
- 注释方式与c语言相同
- 其中src为source的缩写,外部脚本的URL可能的值有:
绝对URL-指向其他站点(src=“www.example.com/example.js”
相对URL-指向站点内的文件(src="/scripts/example.js"
- 用反斜杠进行代码换行
document.write("Hello \
World!");
- 如果在文档已完成加载后执行 document.write,整个 HTML 页面将被write覆盖
<body>
<h1>My First Web Page</h1>
<p>My First Paragraph.</p>
<button onclick="myFunction()">点击这里</button>
<script>
function myFunction()
{
document.write("糟糕!文档消失了。");
}
</script>
</body>
¶arguments和rest
-
arguments
类数组对象,用于存储函数的全部参数,
其中可调用length统计函数的参数个数(从0开始计数 -
rest
js中函数允许接受任意个从参数,
用于获取除了已经定义的参数之外的参数
rest也有"数组用法": rest[0],rest.length
rest只能写在最后面,之前还需要用...
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a = 1
// b = undefined
// Array []
¶函数名使用括号或!
函数是一个对象,函数名是指向这个对象的指针。
函数名后面加上括号或者!就表示立即调用执行这个函数里面的代码。
(function fun(a,b,c)
{
//…
}(1,2,3))//其后的1,2,3为函数执行时的参数
!function fun(a,b,c)
{
//…
}(1,2,3)//同上
- return 语句
javascript 引擎会在行末添加分号
return ;//自动添加分号
{ name:'mz' };//语句无法执行
//正确写法
function method(){
return { //'{'表示语句尚未结束
name:'mz'
};
}
- “==“与”===”
==
会将等号两边的值转为同一类型在进行比较
===
直接进行比较,不进行类型的转换
!==
同理
参考文章:
http://www.w3school.com.cn/js/index.asp
https://blog.csdn.net/qq_16339527/article/details/53231725
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143449926746982f181557d9b423f819e89709feabdb4000
https://blog.csdn.net/nfer_zhuang/article/details/48781671
https://blog.csdn.net/weixin_30637171/article/details/80744819