JavaScript的引用
js的引用方式主要有三种
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--方法一写入script标签-->
<script>
console.log("这句话在控制台输出");
</script>
</head>
<body>
<!--方法二写入元素内-->
<a href="javascript:alert('emmmm')">点我</a>
</body>
</html>
<!--方法三写在单独文件(以下为引用方法)推荐此方法 -->
<!--src 指向文件位置-->
<script type="text/javascript" src="scr.js"></script>
数据类型
JS的数据类型:
基本类型:
String字符串
Number数值
Null空值
Underfined未定义
引用类型:
Object对象
明白JS为弱类型语言很重要弱类型语言
是相对强类型语言
来说的
在强类型语言(如JAVA)中,变量类型有多种,例如int float boolean 等 不同的类型相互转换有时需要强制转换 ;而javascript只有一种类型 var,为变量赋值时会自动判断类型并进行转换
//举例
var int = 10;
var str = "String";
var bloon = false;
//这些在java中你需要用不同的数据类型定义
像我这种有java基础的初学者总喜欢带入一些java的思想,我起初认为js不过是java的一个分支,但大佬对于两者的关系做了一个很通俗的解释:java与JavaScript的关系,就如同卡巴斯基和巴基斯坦的关系,有基巴关系?
作用域
使用var关键词定义的变量为静态变量作用域与java相同;
即:定义于函数内的为局部变量作用于大括号范围内;定义于function外的为全局变量作用全局,有一个与全局变量相似的作用域叫做原型见下方
函数内未使用var定义的变量 被认为是全局变量
变量未初始化认为是未定义的
JS的对象
JAVA的对象JS对象有较大差别,
以我初学者的角度看
JAVA的class像一个模具,对象是通过模具上产的货物,能够使用的是货物不能直接使用模具
JS的对象不需要class生成,像是一个容器,可以向里面放入和删除属性能直接使用
对象的分类
- 内建对象
内建对象由ES标准定义 ; 在任何ES实现中都可以使用
常见的有Match String Object。。。 - 宿主对象
宿主对象由运行环境(如浏览器厂商)提供如Dom - 自定义对象
由开发者创建
ES标准全写ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,所以它可以理解为是JavaScript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。
对象的创建和属性
这是创建对象的常规方法,但通常我们用字面量创建
//创建对象的常规方法
var obj= new Object();
//此时内存中为obj{}
//向对象中添加属性
//因为js为弱类型语言所以属性的值可以为任意类型包括对象
obj.name="OVO";
//此时内存中为obj{name:ovo}
//调用属性
console.log(obj.name);
//弹出对话框显示OVO
//更改属性
obj.name="昆西";
//此时内存中为obj{name:昆西}
//删除属性
delet obj.name;
//此时内存中为obj{}
//有java基础比较 容易理解
属性的另一种操作方式为obj[n]
(此处n可以为变量;也可以为任意字符串,字符串要用双引号包裹),这种方法不能用于对象创建。
以对象名加点的方式被调用“属性”不能更改,相比obj.XX
更加灵活。
js的对象名和java类似都可以看做指针因而涉及ojb1=ojb ; ojb1==ojb
这一类内存结构的经典问题
属性的枚举
当我们拿到一个陌生的对象而无从下手可以使用for。。in。。语句
for(var n in obj){
alert(n); //枚举属性打印属性名
alert(obj[n]);//打印属性值
}
用’对象字面量’创建对象
相比常规方法,这种方法更为简洁,是我们主要使用的方法
var obj1={
name:"阿库娅",age=16;
obj3:{name:"琪露诺"}//这是一个对象中的对象
};
属性名与值为键值对结构
k-v之间用“:”隔开,属性间用“,”隔开
也可以在对象内定义对象写在{ }内
使用工厂制造对象
在了解函数后,我们可以用函数快速制造对象;但创造出的对象类型相同,不方便区分
<script>
function create(a) {
var obj = new Object();
obj.number = a;
obj.say = function () {
alert("给我也整"+this.number+"个");
}
return obj;
}
var obj1= create(1);
var obj2= create(2);
obj1.say();
obj2.say();
</script>
构造函数
构造函数和普通函数存在调用区别
构造函数会调用创建一个对象并将对象作为返回值返回
function Person(name , age ){
this.name = name;
this.age = age;
}
var per1 = Person(); //普通函数调用
var per2 = new Person(王小明,233);//调用构造函数
我们可以发现构造函数创建对象和java类创建实例很像,有时js构造函数也被叫做类,创建的对象被叫做实例
原型
利用构造函数创造的对象都会有一个隐藏属性原型.prototype
[也可以用obj.__proto__
(两边都是双下划线)访问]。原型是一个独立的公共空间。因此我们可以将对象的共有属性设置到原型中,同时避免污染全局作用域 。
原型也有原型,这个原型是他父亲的原型,object的原型没有原型,因为他没有父亲。
function Person(name , age ){
this.name = name;
this.age = age;
var a = 1; //这里用var在构造函数定义的一个属性b,仅作用于构造函数内
}
Person.prototype.b =123; //在原型中定义一个b
var c = 3; //全局的c
var per1 = new Person("王小明",23);
//此时pre1可以使用的属性name,age,公用的b,全局的c ;没有a
per1.a = 345; //此时pre1中创建了a会优先使用自己的b
var per2 = new Person("王大明",24);//pre2没有自己的b使用公用的
console.log("per1a:"+per1.a);
console.log("per2a:"+per2.a);
Person.prototype.sayHello = function(){
alert("hello");
} //原型中也可以定义方法