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生成,像是一个容器,可以向里面放入和删除属性能直接使用

对象的分类

  1. 内建对象
    内建对象由ES标准定义 ; 在任何ES实现中都可以使用
    常见的有Match String Object。。。
  2. 宿主对象
    宿主对象由运行环境(如浏览器厂商)提供如Dom
  3. 自定义对象
    由开发者创建

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");
        }                                   //原型中也可以定义方法