JavaScript学习笔记
2018-01-22 本文已影响14人
吴蜀黍
- 1.常用数据类型:
Nunnber
String
Array
Date
- 2.强制类型转换方式 :
var a = "10";
var result = (Nunber) a + 1;
//可以将字符串开头的几个数字转成int
var b = "12px";
parseInt(b)==>12
- 3.关于boolean类型
在js中NaN
underfined
0
这三个是数是false
以外,其他的都是true
。 - 4.对象
function Person(name, age){
//声明属性必须要用this
this.name = name;
this.age = age;
}
//对类属性的调用可以通过对象点出来
var p1 = new Person("张三",12);
var name = p1.name
//或者对象["类属性名称"]
var age = pr["age"]
function fn(){
alert("弹出框");
return "100";
}
//将y变量指向整个函数fn,可以 通过x()来调用函数。
var x = fn;
//此时代表的是调用函数fn,并将它的返回值赋给y。
var y= fn();
var array = new Array(4, 11, 24, "5");
//删除下标为2的后面的1个元素 并在删除位置插入99,22两个元素
array.splice(2,1,99,22); //-->输入结果为:4,11,99,22,5
- 5.函数
//函数的参数和调用没有关系,如果函数只有一个参数,但是却传入了两个参数,仅仅只会匹配一个,所以JS中函数不存在重载,后面定义的函数会覆盖前面定义的
function fn(num1,num2,){
reutrn num1 + num2 + 1;
}
//调用返回 3
alert(fn(1,1,2));
function fn(num1){
reutrn num1 + 1;
}
//调用返回 2
alert(fn(1,1,2));
//出了常用的定义类型,还可如下定义方式:
var fn1 = new Funcion("num1","num2","alert('结果:'+(num1+num2))");
fn1(11,22);//==>33
//-----------------------------------------华丽分割线---------------------------------------
//函数可以通过参数的方式传入
function callFun(fun,arg){
return fun(arg);
}
function say(arg){
alert("Heool "+arg);
}
callFun(say,"张三");
//也可以通过返回值的方式返回
function fn1(num){
var fn2 = function (arg){
return num + arg;
}
return fn2;
}
var fn3 = fn1(100);
alert(fn3(1));//==>101
//-----------------------------------------华丽分割线---------------------------------------
//arguments关键字,可以通过该关键字获取相应属性的参数值,这个属性是一个数组,其实就是传递进来的参数
//arguments这个对象中有一个callee方法,可以反向调用函数,实现函数名的解耦合
function fn1(num){
if(num <= 1) return 1;
else return num * arguments.callee(num - 1);
}
//this: this关键字在调用时候回根据不同的对象变得不同
var name= "张三";
function hello(){
alert(this.name+ "说:你好!");
}
function Person(name){
this.name=name;
this.hello=hello;
}
var p = new Person("李四");
//此时调用者是Person
p.hello();//==>李四说:你好!
//此时的调用者是window
hello();//==>张三说:你好!
- 6.原型
//以下方式将会重写原型,由于原型重写,而且没有通过Person.prototype来指定,此时的constructor不会
//再指向Person而是指向Object,如果constructor真的比较重要,可以在json中说明原型的指向
Person.prototype = {
constructor:Person,//手动制定constructor
name: "张三",
age: 22,
say: function(){
aler(thsi.name+"," + this.age);
}
}

动态原型
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friedns = friends;
//判断Person.protorype.say是否存在,如果不存在则创建
if(!Person.protorye.say){
Person.protorye.say = function(){
alert(this.name + "[" + this.friends + "]");
}
}
}
继承
//基于原型链的方式实现继承
function Parent() {
this.pv = "parent";
}
Parent.prototype.showParentValue = function() {
alert(this.pv);
}
function Child() {
this.cv = "child";
}
Child.prototype = new Parent();
Child.prototype.showChildValue = function() {
alert(this.cv);
}
var c = new Child();
c.showChildValue();
c.showParentValue()
//-----------------------------------------华丽分割线---------------------------------------
//在使用原型链进行继承一定要注意以下问题:
//1.不能 在设定了原型链之后,再重新为原型链赋值
//当执行下面的代码,就意味着Child原型又重写了,就不存在继承关系了
Chil.prototype = {
showChildValue = function() {
alert(this.cv);
}
}
//2.一定要再原型赋值之后才能添加或者覆盖方法
Child.prototype.showChildValue = function(){
alert(this.cv);
}
//如果以上代码在[Child.prototype = new Parent()]之前执行,那么就会继承之后就会覆盖该方法。
/**
* 使用原型链继承,最大的确定就是,无法从子类中调用父类的构造函数,这样就没办法把子中的属性赋值到父类
* 第二个就是,如果父类有引用类型,此时这个引用类会天阶岛子类的原型中,当第一个对象修改了这个引用之后,其他对象的引用同时修改
*
**/
