JS学习——1

1.基本数据类型

js中的基本数据类型分为以下几个:

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Object

null与undefined

其中,null与undefined是我们最不容易区分的。在js中,null代表一个空对象,本质上也是一个Object对象,而Undefined则是表示一个未赋值的变量


2.Object操作

声明/实例化Object

var obj = new Object();

为对象增加成员变量

var obj = new Object();
//方式一
obj.name = "张三";
//方式二,该方式可以存取特殊属性名,同时,[]内可以是变量
obj["age"] = 33; 
obj["123"] = 123;
var gender = "gender";
obj[gender] = "F"

注意:js中没有命名规范,也就是说数字也可以放在首位

为对象中增加成员方法

var obj3 = new Object();
obj3.fun1 = function(){
	console.log("hello world");
}
obj3.fun1();

枚举对象中的成员

我们可能直到某些对象的存在,但我们并不知道对象中到底有什么成员 。这时我们可以通过枚举的方式遍历对象中的成员。

我们可以看作是java中的foreach语句

for(var v1 in obj){
	console.log(v1);
}

 


3.函数

在js中函数也是一个对象

var fun = new Function();

通过对象调函数叫调方法

直接调用函数叫做调函数

立即执行函数

在js中,通常我们需要先声明一个方法,然后去调用它。这是两个步骤。而且有时候我们需要某个函数只在当时只执行一次,并不需要赋值给其他变量或者进行声明。

那么如何在我们创建函数时实现立刻执行并且不需要声明或者赋值呢

我们可以通过立即执行函数的方式进行调用(我认为这个是匿名函数调用)

(function(){console.log("hello")})();
//用括号包裹方法来将方法作为一个整体。最后用括号来实现调用,如果有参数那也可以增加参数

注意:使用var关键字声明的变量,会在所有代码执行前被声明,但不进行赋值。也就是说我们可以在对象被赋值前就可以对变量进行操作,但是操作的是个undefined值,真正的赋值在执行到目标语句时执行。 

方法有两者声明方式,一种直接function function_name(){}声明,另一种将方法赋值给变量。那么两者有甚区别呢

前者可以在方法声明代码被调用,后者不行

原因:如上述提到使用var关键字声明的变量,会在所有代码执行前被声明,但不进行赋值。也就是说,方法对象的变量只是被被声明还未被赋予方法对象。所以调用会报错。

在函数中不适用var声明的变量会被作为全局变量。


4.JS作用域

js中也有两个作用域:

  • 全局作用域
  • 函数作用域

全局作用域

在全局作用域中,创建的变量都会作为window对象的属性进行保存


5.this

this在js中的分量举足轻重。它代表的是调用者对象。通过这个this我们才能在被调用函数中实现多态变换

function fun4(){
	console.log(this.name);
}

var p1 = {name:"张三",showName:fun4};
var p2 = {name:"李四",showName:fun4};
			
p1.showName();
p2.showName();
/*
张三
李四
*/

那么问题来了,这个this哪里来的。

this从何而来

解析器在调用函数时会隐式传入调用者对象


6.构造函数

在js中除了Object以外我们还可以定义自己的类对象。但是我们学过面向对象的都知道,new一个对象实例是通过调用目标的构造方法完成对象实例化的。那么js中的构造方法有何不同呢,以及如何定义自己的类。

function Person(name,age){
	this.name=name,
	this.age=age
}
var obj1 = new Person("张三",11);

 

注意:构造函数与普通函数做的不同只是调用方式的不同


7.原型对象

首先我们看一个图

我们可以看到除了我们定义的name和age以外,还有一个__peoto__对象,这个对象就是我们的原型对象。

什么是原型对象

原型对象就是一块我们目标类所有实例对象共享的一块区域。比如我根据我的Peron构造方法构造了好多person,它们每个实例对象中的__proto__都会指向同一个原型对象。

原型对象有什么作用

当我们通过在构造方法中或者通过工厂方法创建对象时,每个对象内的方法对象都是独立的,也就是说一万个对象就有一万个一模一样的方法对象。这是对内存极大的浪费,是不推荐的。那怎么解决呢?

有小伙伴想了,我们可以在全局中声明方法对象,然后在对象内引用即可。没错,这可以解决我们刚才的问题,但是也会引发新的问题,我们什么方法都定义在全局中,这无疑是增加我们全局对象的复杂性啊,增加了拓展、维护的成本。

所以这时候我们可以用到我们的原型对象了,既然原型对象是共有的,那我们就可以将公共的成员变量和方法对象放入原型对象中。

每个对象访问属性时首先会在自己的区域中寻找,没有则去原型对象中查找,如果在再没有就去原型对象的原型对象中寻找。这可不就是套娃嘛。当然这也是有尽头的。Obejct对象的原型对象是没有原型对象的。而我们自己定义的对象的原型对象是Obejct类型的

注意:我们的构造方法也是放在原型对象中

原型对象从何而来

创建的每个函数,解析器都会向函数中添加一个属性__proto__


8.如何判断对象中是否有目标属性

  • "fieldName" in obj
  • obj.hasOwnProperty

两者有什么区别,前者判断中会包含原型对象中的属性,后者则不会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来是肖某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值