JavaScript简称js,是一门用于前端开发的一门面向对象的脚本语言,动态响应,获取数据,而且无需编译,直接放浏览器运行. Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验)
2.1.一切皆对象
JavaScript中一切皆对象,在JavaScript中我们可以把任何(基本数据)类型当成对象来使用。这点于Java中既然不同,Java中的基本数据类型是不能调用方法,只能通过包装类型。
(1)JavaScript中一切皆对象,在JavaScript中我们可以把任何(基本数据)类型当成对象来使用。 (2)基本数据类型:number/boolean/string/null(值:null)/undefined(undefined) (3)引用数据类型:Object/Array/Regexp/Date/Number/Boolean/String…
//基本数据类型中number. var num1 = 3.14159; console.debug(num1.toFixed(2)); //一切皆对象 console.debug(typeof num1);//number //引用数据类型Number var num2 = new Number(3.14159); console.debug(num2.toFixed(2)); console.debug(typeof num2);//object2.2.js中true和false的判断
js 中所有值的真假性: 0,"",undefined,NaN,null,false(基本数据类型的false)为false,其他值都为true.
var b1 = false; if(b1){ console.debug("看能不能 出来"); } //js 中所有值的真假性: 0,"",undefined,NaN,null,false(基本数据类型的false)为false,其他值都为true. var b2 = new Boolean(false);// 这里是创建的一个对象添加值,对象肯定不为空 if(b2){ console.debug("哈哈哈"); }2.3 创建对象和操作
//普通创建 var obj = new Object(); //添加元素 obj.name = "妞妞"; obj.age = 11; //添加方法 obj.eat = function(){ console.log("2222"); }; //josn创建 var obj1 = {"age":20,"name":"花花"}; obj1= {"sex":"女"}; console.log(obj1.sex); //如果要创建一个引用数据类型对象, 需要先创建一个函数(构造方法) function Person(){} var person = new Person(); person.name = "哈哈"; person["sex"] = "女人"; person.age = 22; //调用方法 就不用打印了 obj.eat(); //这两种都能调用, console.log(person.name); //这种适合在 for in 循环的时候取值 console.log(person["name"]); //遍历方式 var obj = {}; obj.name = "huahua"; obj.age = 22; obj.paly = function(){ console.log("你要培训挨不过"); } //遍历 for in for(var key in obj){ //不能这样写 因为obj里面没有 key这个属性 //console.log(obj.key); //这样写可以,但是方法不能直接打印出里面的属性 //console.log(obj[key]); //所以遍历需要判断 看是不是方法 if(typeof obj[key] == 'function'){ obj[key](); }else{ console.log(obj[key]); } }2.4.JSON对象和JSON字符串
//json 字符串 var jsonStr = '{"name":"哈哈哈","age":18}'; console.log(jsonStr); //json 字符串转成json对象 eval方式 var jsonObj = eval("("+jsonStr+")"); console.log(jsonObj); //JSON.parse 方式 但是jsonStr必须是标准的格式 var jsonObj1 = JSON.parse(jsonStr); console.log(jsonObj1); //jquery也有方法转换 底层还是使用JSON.parse方法进行转换,也就是字符串格式也必须要标准的 var jsonObj2 = $.parseJSON(jsonStr); console.log(jsonObj2);2.5.Js类 JavaScript中没有为我们提供像Java中定义类的关键字class。JS中定义类只需要定义这个类的构造函数即可,函数名使用首字母大写。 (1)JavaScript中没有为我们提供像Java中定义类的关键字class。 (2)JS中定义类只需要定义这个类的"构造函数"即可; 构造函数与普通函数没区别. (3)只要是类,类名就是首字母大写。
//构造函数中this,就是实例对象 //如果要为对象添加属性,那么需要使用 "this.属性名 = 值;" function Person(name,age){ this.name = name; this.age = age; } var p1 = new Person("花花",22); var p2 = new Person("小子",33); console.log(p1); console.log(p2);2.6window的name属性 我们说过,变量要先定义才能使用。但是name是一个特殊的,可以当成java中关键字。直接使用name表示是使用的window.name属性。默认window.name是空字符串。但是我们可以给这个name赋值。
//函数的name var fun1 = new Function("a","b","return a+b"); fun1.name = "牛逼"; fun1.age = 43; //函数里面name的值比较特殊 它是只读的 不可修改 console.log(fun1); //window里面默认有个属性name 默认值的空字符串 console.log(window.name); window.name = "湿哒哒所大"; console.log(window.name); var name = "你是假的"; console.log(window.name);2.8.js中的this
//this表示,谁调用这个方法,this就指向谁。 var obj = { "name" : "康娜酱" }; function sayHello() { return this.name;//谁调用这个方法sayHello,this就代表是谁 } obj.say = sayHello;//赋值 console.debug(obj.say());//康娜酱 sayHello是obj对象在调用,所以this指向了obj. console.debug(sayHello());//空字符串 直接调用sayHello,相当于是window.sayHello(),所以this指向window,默认的window的name是空字符(1)什么是原型:prototype,他是类或者对象里面的属性,通过他可以给对象添加属性和方法, 在一个类中加上原型方法,它对应的所有对象都拥有了这个方法. (2) 每个对象原型是共享的,多个对象只要类相同,它们的原型也是相同的 (3)属性查找规则,先从自定义的属性上面找,没有找到,在从原型上面找 (自定义->原型->原型的原型,…)
类.prototype.方法名 = function(){}
/*prototype指原型的,每一个对象都有prototype的这个属性,我们可以通过该属性往 对象上面添加属性和方法*/ function User(name,age,sex){ this.name = name; this.age = age; this.sex = sex; /*this.eat = function(){ console.log('不知道啊啊,要不要死了'); }*/ } User.prototype.eat = function(){ console.log('asdsadasdsa..'); } var user1 = new User('小爱',18); console.dir(user1); var user2 = new User('小炮',28); console.dir(user2); //对象里面原型属性 --这个原型属性也是一个对象 console.dir(user1.prototype === user2.prototype); console.dir(user1.__proto__ === user2.__proto__); //(1)同一个类的不同实例的原型是共享的; user1.__proto__.age = 22; //(2)对象属性查找规则,先从自定义的属性上面找,如果找到,就返回,如果没有,从原型上面去找 console.log(user1); console.log(user2); console.log(user2.age);//undefined user1.eat();3.1回调函数
回调函数就是一个通过函数(对象)引用调用的函数; 如果你把函数的引用(地址)作为参数传递给另一个函数,当这个引用被用来调用其所指向的函数时,我们就说这是回调函数。
//回调函数:就是一个通过函数(对象)引用调用的函数; //这里设置定时器 调用的 时候不加扩号,加了就是立马执行 setTimeout(Time,3322); function Time(){ alert("222"); }3.2匿名函数
//匿名函数:没有名称的函数 //匿名函数 有什么用:一次性执行 //推荐写法 一般用这个 (function(){ //alert(1111); })(); /* ~function(){ alert(2222); }();*/ /*+function(){ alert(3333); }(); */ /*匿名函数有什么用: (1) 只想执行一次 可以使用,解决作用域污染问题(比如只想要结果,可以屏蔽不要的实现) (2)作为一个参数来传递*/ //解决作用域污染 var x = 10; var y = 20; var z = x*y; //只要结果.但是z 跟y 都到作用域以后了 console.log(z); console.log(window); //正确写法:使用()括起来: // (function(name){ // console.debug("请说出你的名字:" + name); // })//这样就表示申明了一个函数,只是说是一个匿名函数。但是还没有调用 //直接调用匿名函数:函数的调用:函数名(); (function(name) { console.debug("请说出你的名字:" + name); })();//现在是调用了,但是没有传参数 (function(a, b) { var result = a * b;//用一个局部变量接收 window.result = result;//赋值给window的一个全局变量 })(10, 50);//传参调用 console.debug(result); console.debug(window);3.3闭包(面试题)
//最简单的闭包,函数里面使用函数外面的变量 var name = '哈哈哈'; function get(){ console.log(name); } get(); var sum = 0; function add(){ return sum++; } console.log(add()); console.log(add()); sum = 10; console.log(add()); console.log(add()); console.log(add()); //打印结果0,1,10,11,12 //闭包:实现只读的属性 //闭包和匿名函数结合来使用 实现只读的属性 (function(){ var a = 0; //这里要用window 存到作用于才能被调用 window.getsum = function(){ return a++; } })() console.log(window.getsum()); console.log(window.getsum()); console.log(window.getsum()); a = 22; console.log(window.getsum()); console.log(window.getsum()); //打印结果 0,1,2,3,43.4事件委托 前面的基本的事件绑定,在功能有一个局限。就是绑定事件的元素,必须是在绑定的时候已知的、存在的。对于以后出现的元素是不起作用,事件委托就可以处理这种情况。 下面是一个列子: 有这么一个需求,已经存在一个添加附件的组件,现在因为需求原因,需要动态增加多个添加附件的组件,同时增加删除,查看等操作。
<script type="text/javascript"> $(function(){ $('#addFile').click(function(){ $('#userForm').append("<div>附件:<input type='file' name='file'/><a href='javascript:void(0)' class='delete'>删除</a></div>") }) /* 不行 * $(".delete").on('click',function(){ alert('123'); })*/ //selector 事件委托写法 $('#userForm').on('click','a.delete',function(){ alert(111); }) }) </script> </head> <body> <a id="addFile" href="javascript:;">添加更多附件</a> <form id="userForm"> <div> 附件:<input type="file" name="file" /> </div> </form> </body>