重温Javascript(一)-基本概念
2017-04-02 13:35 DoPeter 阅读(700) 评论(0) 编辑 收藏 举报工作中要用到JavaScript,一组复习笔记。
一些看法
1. 想想JavaScript目前最常用的宿主环境,浏览器或者服务端V8,都是单线程,所以不用过多的考虑并发的问题,如果是协程来实现异步的方法,反正就是不用考虑竟态条件了。
2. 开发方式。又是OOP,又是OOF,对独立开发来说就是尽情发挥了。对协作开发来说,有时规范不是很好统一,可以实现的方式太过灵活,晕头转向是常有的事,要想通俗易懂,命名比写C# JAVA这类语言有更高的要求。反正经常看不明白this,鬼知道是被丢到哪个环境中被调用了。我想TypeScript也是无奈之下出来的解决方案了。
3. 性能,每个终端有每个终端的环境也罗列不全,套的越深,越是坑。
简单想想,最需要关注的还是JavaScript的OOP语法模型,毕竟不管是在浏览器或是服务器,其他的对象都封装好了,更多的考虑是实现功能的信息模型。
Object类型
Object类型是所有对象实例的基类。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(不是原型)是否存在。参数propertyName必须是字符串。
isPrototypeOf(object):object的原型链具有当前实例的原型链,则返回true。
全等操作符
除了在比较值钱不转换操作数之外,全等和不全等操作符没什么区别。全等操作符由3个等号表示,只在两个操作数未经转换就相等的情况下返回。
函数arguments
函数的agruments对象类似数组,可是使用索引来访问,arguments[0],也有length属性
值传递和引用传递
其实这点有点像C#。
1.基本类型值的复制
1 2 | var num1=5; var num2=num1; |
2.引用复制
1 2 3 4 | var obj1= new Object(); var obj2=obj1; obj1.name= "peter" ; alert(obj2.name); //peter |
3.传递参数
基本类型值的传递如同基本类型变量的复制,引用类型值得传递,如同引用类型变量的复制。
1 2 3 4 5 6 7 8 9 10 | function addTem(num){ num+=10; return num; } var count=20; var result=addTen(count); alert(count); //20 没有变化 alert(result); //30 |
1 2 3 4 5 6 7 | function setName(obj){ obj.name=“peter”; } var person= new Object(); setName(person); alert(person.name); //peter |
坑一 变量喜欢乱跳域
1 2 3 4 5 | for ( var i=0;i<10;i++){ doSomething(i); } alert(i); //10 |
Function类型
每个函数都是Function类型的实例,都与其他引用类型一样具有属性和方法。由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。
1 2 3 4 | function sum(num1,num2){ } var sum= function (num1,num2){}; |
坑二 函数指针变化
1 2 3 4 5 6 7 | function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1) } } |
根据上面函数指针的说法,factorial这个名字是可以指向另外的函数的,所以这个函数有可能在运行时被动态改变。
出坑的方法
1 2 3 4 5 6 7 | function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1) } } |
arguments.callee是一个指针,指向拥有这个arguments对象的函数
1 2 3 4 5 6 | var trueFactorial = factorial; factorial = function (){ return 0; }; alert(trueFactorial(5)); //120 alert(factorial(5)); //0 |
this
如果层级很绕,很难看清楚。
总结就是,谁调用该函数,this就指向谁
1 2 3 4 5 6 7 8 | window.color = "red" ; var o = { color: "blue" }; function sayColor(){ alert( this .color); } sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue" |
apply和call方法
在特定的作用域中调用函数,设置函数体内this对象的值
call与apply第一个参数都是作用域,后面的参数call必须一一列举,apply可以使用数组
1 2 3 4 5 6 7 | function sum(num1, num2){ return num1 + num2; } function callSum(num1, num2){ return sum.call( this , num1, num2); } alert(callSum(10,10)); //20 |
bind方法
会创建一个函数的实例,this值会被绑定到传给bind函数的值
1 2 3 4 5 6 7 | window.color = "red" ; var o = { color: "blue" }; function sayColor(){ alert( this .color); } var objectSayColor = sayColor.bind(o); objectSayColor(); //blue |
encodeURI和encodeURIComponent的区别
encodeURI不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和#;encodeURIComponent会对它发现的任何非标准字符进行编码
1 2 3 4 5 6 7 | var uri = "http://www.wrox.com/illegal value.htm#start" ; //"http://www.wrox.com/illegal%20value.htm#start" alert(encodeURI(uri)); //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start" alert(encodeURIComponent(uri)); |
eval方法
当解析器发现代码中调用eval()方法时,会将传入的参数当做实际的ECMAScript语句来解析,把执行结果插入原位置。通过eval执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。通过eval执行的代码可以引用在包含环境中定义的变量
1 2 | var msg = "hello world" ; eval( "alert(msg)" ); //"hello world" |
1 2 | eval( "function sayHi() { alert('hi'); }" ); sayHi(); |
1 2 | eval( "var msg = 'hello world'; " ); alert(msg); //"hello world" |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步