学习笔记——JS语言精粹
JS作用域是基于词法作用域的顶级对象。
JS是一门弱类型语言,强类型能在编译时检测错误。
JS是唯一一门所有浏览器都能识别的语言。
块注释对于被注释的代码是不安全的,例如/* var rm=/a*/.match(s); */
JS只有一个数字类型,没有分离出整数类型,完全避免了短整型的溢出问题。
NaN不等于任何值,包括他自己。
JS所有字符都是16位。
JS允许数组包含任意类型的值。
字符串是不可变的,一旦被创建,永远无法改变它,但是可以通过+运算符连接其他字符串来创建一个新字符串。
2个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串,所以'c'+'a'==='ca'是true
switch,while,for,do语句配合break语句来使用。
falsy的值:
- false
- null
- undefined
- 空字符串''
- 数字0
- 数字NaN
其他都被当做真。
for in会枚举一个对象的所有属性名(键名),需要object.hasOwnProperty(variable)来确定这个属性名是该变量对象的成员还是来自原型链。
do在代码块执行后再检测,while在执行前检测。
+运算符可以进行加法运算或字符串连接。如果想加法运算,两个运算数都得是数字。
如果第1个运算数的值为假,运算符&&产生第1个运算数的值,否则产生第2个运算数的值。
如果第1个运算数的值为真,运算符||产生第1个运算数的值,否则产生第2个运算数的值。
JS简单数据类型包括数字,字符串,布尔值,null值,undefined值,其他所有的值都是对象。
检索方式:
- []
- .(优先考虑)
如果字符串是合法的JS标识符且不是保留字,那么也可以用.来检索。
||可以填充默认值:var middle=stooge["middle-name"]||"(none)";
对象里的值可以通过赋值语句来更新,如果属性名已存在对象里,那么这个属性的值就会被替换。如果对象之前没有那个属性名,那么该属性就扩充到对象中。
Object.create()可以创建一个使用原对象作为其原型的新对象。
delete运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性会被移除。它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透显出来。
对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype。每个函数在创建时会附加2个隐藏属性:函数上下文和实现函数的代码。
当实参的个数>形参的个数,超出的参数值被忽略。
当实参的个数<形参的个数,缺失的参数值被替换为undefined。
- 方法调用模式。就是一个函数被保存为对象的一个属性。当一个方法被调用时,this被绑定到该对象。this到对象的绑定发生在调用的时候。
- 函数调用模式。this被绑定到全局对象,可以通过定义一个变量that保存this。
- 构造器调用模式。如果在一个函数前面加上new来调用,会创建一个连接到该函数的prototype成员的新对象,同时this被绑定到那个新对象上。
- apply调用模式。apply接收2个参数,第1个是要绑定给this的值,第2个是一个参数数组。
当函数被调用,可以通过arguments数组来访问到所有它被调用时传递给它的参数列表。(包括实参>形参,超出的实参)
throw语句中断函数的执行,它会抛出一个exception对象,该对象包含一个用来识别异常类型的name属性和message属性。这个exception对象会被传递到try的catch从句。
var add=function (a,b){
throw{
name:'TypeError',
message:'add needs numbers'
};
}
var try_it=function(){
try{
add('7');
}cache(e){
document.write(e.name+':'+e.message);
}
}
移除首尾空格的方法:
String.method('trim',function(){
return this.replace(/^\s+|\s+$/g,'');
}
要确定没有该方法时才添加方法:Function.prototype.method=function(name,func){}
使用函数和闭包来构造模块。
级联可以在一个语句中一次调用同一个对象的很多方法。A.().B().C()
柯里化(局部套用),把多参数函数转换为一系列单参数函数并进行调用的技术。
记忆:将先前的操作结果记录在某个对象里,避免无谓的重复计算。比如斐波那契数列。
优化前:
var fib=function(n){
return n<2?n:fib(n-1)+fib(n-2);
}
for(var i=0;i<=10;i++){
console.log(fib(i));
}
优化后:
var memoizer=function(memo,formula){
var fib=function(n){
var result=memo[n];
if(typeof result !=='number'){
result=fib(n-1)+fib(n-2);
memo[n]=result;
}
return result;
};
return fib;
};
var fibb=memoizer([0,1],function(fib,n){
return fib(n-1)+fib(n-2);
});
当一个函数对象被创建时,构造器产生的函数对象赋予一个prototype属性,它的值是一个包含constructor属性且属性值为该新函数的对象。
用new调用一个函数时,函数执行方式:1.创建一个新对象,继承自构造器函数的原型对象 2.调用构造器函数,绑定this到新对象上 3.如果它的返回值不是一个对象,就返回该新对象。
差异化继承:
var myMammal={
name:'hello',
get_name:funcrion(){
return this.name;
},
says:function(){
return this.saying||'';
}
}
var myCat=Object.create(myMammal);
myCat.name='world';
myCat.saying='meow';
数组的长度length:length的属性值时这个数组的最大整数属性名+1,它不一定等于数组里的属性个数。arr[100001]=true; arr.length//100002
设置更大的length不会为数组分配更多的空间,设置更小的length会把>=新length的属性删除。
for in遍历无法保证顺序,而且在原型上加扩展方法会被for in出来。所以最好用hasOwnProperty()判断。
学习笔记——JS语言精粹的更多相关文章
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- amazeui学习笔记--js插件(UI增强)--警告框Alert
amazeui学习笔记--js插件(UI增强)--警告框Alert 一.总结 1.警告框基本样式:用am-alert声明div容器, <div class="am-alert" ...
- amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...
- amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse
amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...
随机推荐
- 理解 ASP.NET Core: 处理管道
理解 ASP.NET Core 处理管道 在 ASP.NET Core 的管道处理部分,实现思想已经不是传统的面向对象模式,而是切换到了函数式编程模式.这导致代码的逻辑大大简化,但是,对于熟悉面向对象 ...
- HDU100题简要题解(2080~2089)
//2089之前忘做了,周二C语言课上做,至于2086,写题解的时候突然发现之前的做法是错的,新的解法交上去CE,等周二再弄吧,其余题目暂时可以放心 HDU2080 夹角有多大II 题目链接 Prob ...
- PHP的命令执行漏洞学习
首先我们来了解基础 基础知识来源于:<web安全攻防>徐焱 命令执行漏洞 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.pas ...
- 记一次容器内执行ansible命令卡住
1.由来 最近在使用kylin_v10系统,发现当在此系统下运行的容器内执行#ansible localhost -m setup 命令会卡住不动,于是和同事一起经过如下排查最终找到解决问题的办法. ...
- ABBYY FineReader如何将图片转换为Excel
ABBYY FineReader的OCR文字识别功能很强大,不但可以将文件转换为文本文档或Word文档,也可以识别PDF文件或者图片上的表格,并且转换为Excel文件.下面我就为大家演示一下怎么用AB ...
- Math对象-JavaScript
Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法.Math 不是一个函数对象. Math 用于 Number 类型. Math 的所有属性与方法都是静态的. 属性 Math.E 欧拉常数 ...
- jQuery 第七章 实例方法 位置图形
位置坐标图形大小相关方法: .offset() .position() .scrollTop() .scrollLeft() .width() .height() .innerWidth() inne ...
- 【ubuntu】搭建mysql5.7
一.安装mysql (一) 安装mysql 注意别安装8,8配置太高了 $: sudo apt-get install mysql-server or $: sudo apt-get install ...
- 【PUPPETEER】初探之原生frame切换(四)
一.知识点 page.frames() 使用frame.url() 获取framed的url x.getAttribute('x') 获取元素内值 二.实例 问:什么是iframe? 答:iframe ...
- eslint报错: Unexpected any value in conditional. An explicit comparison or type cast is required
原代码: record.modifiedTime? 修改后代码:typeof record.modifiedTime !== 'undefined' ? (isAddType === true ? ...