js笔记
var myDate = new Date();
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-????)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
myDate.getHours(); //获取当前小时数(0-23)
myDate.getMinutes(); //获取当前分钟数(0-59)
myDate.getSeconds(); //获取当前秒数(0-59)
myDate.getMilliseconds(); //获取当前毫秒数(0-999)
myDate.toLocaleDateString(); //获取当前日期(数字格式)
myDate.toDateString(); //获取当前日期(英文格式)
var mytime=myDate.toLocaleTimeString(); //获取当前时间
myDate.toTimeString(); //获取当前时间
myDate.toLocaleString(); //获取日期与时间
//原始类型的引用类型 Boolean类 Number类 String类
.valueof() 查看该引用类型的值
.toFixed() 返回带几位小数的数值
.toExponential() 返回用科学计数法表示的数值
位运算:
按位取反NOT(~):转换成32位二进制,按位取反
按位与AND(&):转换成32位二进制,与运算
按位或OR(|):转换成32位二进制,或运算
按位异或XOR(^):1^1=0 1^0=1 0^0=0
Array类
.push 用于在Array尾部插入一个或多个项
.pop 用于删除Array最后一个数组项
.shift 用于删除Array的第一个项
.unshift 用于把一个项放在数组的第一个位置,然后把余下的项向下移动一个位置
.parseInt()转整数 .parseFloat()转小数 .number()转数字 .toString()转成字符串
new做的4件事:开辟空间,this指针赋值给新的对象名,设置属性和方法值,返回对象
new的对象的属性和方法存放在堆空间上,对象名实质上是变量,存放在栈空间上,并指向那个堆空间
js中调用属性可以--对象名["属性名"],来调用
var key in json中的key表示为一个量,一般为string类型的,用来存放属性名
遍历对象可以用for-in循环,因为对象是无序属性的集合
传参问题:实参的值复制一份副本给形参,形参获取值之后进行运算
传值可能无法修改实参的值,传指针肯定能修改是实参的值
JavaScript中可以在某个元素前使用 ‘+’ 号,这个操作是将该元素转换秤Number类型
slice有两种传参方式,一种是slice(start,end); 一种是slice(start)取start-->end下标之间的数据 (包含start位置数据,不包含end位置数据)
splice(起始位置index,删除元素个数,插入项)
filter 遍历每一个元素,将元素放入回调函数执行,符合函数的将组成新数组返回
bind(a) 将this换为a
if()条件句可以检测某属性的存在,返回undefined,null,NaN则不执行
基本包装类型:本身是基本类型,但是在执行代码过程中,如果这种类型的变量调用性或是方法,那么这种类型就不再是基本类型了,而是基本包装类型,这个变量也不是普通的变量了,而是基本包装类型对象
如果是一个对象&&true,那么结果是true;
如果是一个true&&对象,那么结果是对象;
var num1=Number("10");//类型转换
var num2=new Number("10");//基本包装类型
var A=function (){
var x='a'; //私有属性或方法:只能在对象内部进行访问修改,外部不可访问
this.z='c'; //通过this指针实例属性或方法:任何地方均可访问
};
A.y='b'; //类属性(或方法):类名.属性名(或方法名)来访问
A.prototype.m='d'; //原型属性(或方法):存在于原型链上,原型方法和属性是共享的,对象定义后,只能对象名.属性名(或方法名)来访问,当用对象名.属性名访问,浏览器默认先访问实例属性,没有则会从原型链上查找
var a=new A();
a.n=function(){
实例方法
}
实例上的变量的优先级要高于定义在“this”上的,而定义在“this”上的又高于 prototype定义的变量
通过原型来添加方法,解决数据共享,节省内存空间
实例对象中有个__proto__属性,供浏览器使用,不是标准属性,
构造函数中有个prototype属性,供开发者使用,是标准属性
function原型产生的都有prototype属性指向prototype对象,每个对象都有__proto__属性
var a1=function (){};
var a2=new b();//b是a的构造方法;
则a1有prototype属性,a2没有,但都有__proto__指向prototype对象
Object.getPrototypeOf(对象名)返回[[prototype]]==>__proto__的值
js中所有函数实际上都是Function的构造函数创建出来的实例对象
构造函数、实例对象和原型对象之间的关系:通过new操作符调用构造函数,构造函数先创建原型对象,然后一同创建实例对象,因此调用原型方法必须先创建实例对象.
构造函数中的this是实例对象
闭包的本质就是在一个函数内部创建另一个函数
闭包有3个特性:
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会随函数体的结束而结束
作用:缓存数据,延长作用域链===>也是闭包的缺点造成内存不能及时释放空间
//自调用函数--一次性,只能用一次
(function(){});
//将局部变量作为属性给window就可以将局部变量装换成全局变量
var f=function(){};//方法(构造函数外称为函数表达式),公有的==>外部可以访问
function f(){};//函数(构造函数外称为函数声明),私有的==>外部不可访问
函数声明必须有名字,匿名函数属于函数表达式;函数声明前后可调用函数,函数表达式必须在赋值后才可调用
通过原型对象可以实现继承==>缺点:属性可能重复
通过父级构造函数.call方法也可以实现继承==>缺点:方法不可以继承
因此使用组合继承方式来实现继承,即属性在构造函数中调用父级构造初始化次参数,改变原型对象指向来继承方法
拷贝继承就是改变对象的指向,拷贝某一对象的属性
"use strict";//严格模式,严格模式下代码必须规范,window对象的方法必须window.方法名
javascript中apply、call和bind三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参
区别:
1、call和apply可以直接调用,返回值是你调用的方法的返回值,bind返回的是初始化this值后的拷贝函数
2、call和bind传入的参数值,apply传入的数组
函数中的一些属性:
name--->函数的名字
arguments--->实参的个数
length--->形参的个数
caller--->调用该函数的调用者名字(f1函数定义中调用f2,则f2的caller属性是f1
sort()方法将函数作为参数传入,返回1则两数交换
变量的声明和定义是在一起的,变量和方法的作用域和声明有关,定义可在任何地方。
js中用的是函数作用域,JavaScript的函数作用域是指在在函数内声明的所有变量在函数体内始终是可见的,也就是说在函数体内变量声明之前就已经可用了。
var 声明定义的是局部变量;
不带则是全局变量,同时也是全局对象的属性
js中没有块级作用域--一对大括号中定义的变量是全局变量,
函数中定义的变量是局部变量
浅拷贝:将属性和方法拷贝给另一个对象(不是共用而是复制一份)
深拷贝:如果对象中有数组和对象,则在另一对象重新拷贝(不能将对象共享)
由于js是弱类型的,所以当出现属性名为数字时,可以用“对象名[数字]”或者“对象名["数字"]”,因为弱类型的缘故,该数字既可以是数值,又可以是字符。例如
var obj={
0:21,
1:22,
2:23
};
console.log(obj[0]);//或者obj["0"]都可以输出21
这就是伪数组,
伪数组可以定义length属性,因此伪数组长度不会随着元素的增加而改变
伪数组不可调用数组方法
字面量也就是一下子就看出来值得量或者是常量即是字面量
var age=12;
var people={
age:24,
sayAge:function () {
return age; //返回的是变量age的值,浏览器先从sayAge函数局部作用域中查找,如果有则返回;否则从外部全局作用域查找,一直未 找到则返回undefined
},
sayAge1:function () {
return this.age;//返回this中的age属性,浏览器会查找this指向的对象中的属性,有则返回,无则返回undefined
}
};
如果构造函数返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。还有一点就是null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊
静态方法(类方法)不属于实例化对象,是共有的,所以不能有代表某个对象的this。这句话很好理解就是静态方法直接通过函数名就能使用 ,实例化的对象 无法访问静态方法。因此, 也就没有所谓的this, 同理也就无法使用this了
this为何不能用在静态方法中?
在类里面的静态方法是不能访问类的非静态成员的,原因很简单,我们要想在本类的方法中访问本类的其它成员,我们需要使用this这个引用,而this这个引用指针是代表调用此方法的对象,我们说了静态的方法是不用对象调用的,而是使用类名来访问,所以根本就没有对象存在,也就没有this这个引用了,没有了this这个引用就不能访问类里面的非静态成员,又因为类里面的静态成员是可以不用对象来访问的,所以类里面的静态方法只能访问类的静态的属性,既然this不存在,在静态方法中访其它静态成员我们使用的是一个特殊的类“self”;self和this相似,只不过self是代表这个静态方法所在的类。所以在静态方法里,可以使用这个方法所在的类的“类名”,也可以使用“self”来访问其它静态成员。
"<a href=javascript:void(0)></a>"表示死链接
JavaScript内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。
var n=10; var obj={ n:n, show:function(){ console.log(this.n); } } obj.show();//输出"10" n=100; n=1000; obj.show();//输出"10"
上述代码表明,对象中属性值必须是明确的,即属性后面一般存放确定的值而非指针
JS的运行机制:事件(click,focus等等),定时器(setTimeout和setInterval),ajax,都是会触发异步,属于异步任务;js是单线程的,一个时间点只能做一件事,优先处理同步任务; 按照代码从上往下执行,遇到异步,就挂起,放到异步任务里,继续执行同步任务,只有同步任务执行完了,才去看看有没有异步任务,然后再按照顺序执行
字面量“hello”属于基本数据类型,它上面本身是不包含任何属性和方法的。之所以在实际使用的时候,能像使用对象一样地调用一些属性和方法,是因为:每当读取一个基本数据类型的值的时候,后台就会创建一个对应的包装类型的对象,从而让我们能够调用一些方法来操作这些数据。