基础

1. 可选的分号

只有在缺少了分号就无法正确解析代码的时候,javascript,才会在一行的最后自动添加;

a = 3 //自动填充
b = 4;

var a
a
=
3
console.log(a)

//自动填充为 var a ; a = 3; console.log(a);

var y =x +f
(a+b).toString()

//解析后 var y =x+f(a+b).toString();

//当然 return break continue除外后面会紧跟分号
return
ture;

//解析为 return ; ture;

//++ -- 例外
x
++
y

//解析为 : x; ++y;

2. 二进制浮点数和四舍五入错误

javascript只能表示1/2,1/8,1/1024等浮点数,但是1/10等是不精确的

var x =.3 -.2;
x == .1 //false

3. 日期和时间

var then =new Date(2011,0,1);
var later =new Date(2011,0,1,17,10,30);
var now = new Date();

4. 模式匹配

var text = "texting : 1 ,2, 3";
var pattern = /\d/g; //匹配所有包含一个/多个数字的实例
pattern.test(text) ; //=> true 匹配成功
text.search(pattern); // =>9:首次匹配成功的位置
text.match(pattern); //=>["1","2","3"] 所有匹配组成的数组
text.replace(pattern,"#"); // =>"testing: #,#,#"
text.split(/\D+/); // =>["","1","2","3"]:用非数字字符截取字符串.

5. 布尔值

undefined
null
0
-0
NaN
""

以上自动转为布尔为false

其他所有值,包括对象和数组都为转为true

6 null和undefined

alert(typeof null) //=>object
alert(typeof undefined) // ES5中 =>undefined
null == undefined // => true
null === undefined // => false

只有nullundefined无法拥有方法的值

7 全局对象

Window对象定义了核心全局属性,它也针对浏览器和客户端javascript定义了一少部分其他全局属性.

8 包装对象

var s = "test"
s.len =4;
var t = s.len // =>undefined;

在读取字符串/数组/布尔的属性和方法是可行的,

但你给她们赋属性值,就是不可行的,因为他们只是临时对象,你给她们赋值只是给她们临时值赋值.而且他们是只读的,不能修改

存取字符串/数组/布尔的属性时创建的临时对象叫做包装对象.

String(),Number(),Boolean(),构造函数就是用来显示创建包装对象的.

var s = "test"; //字符串值
var S = new String(s); //字符串对象
s == S //false;
s === S //true;

9 不可变的原始值和可变的对象引用

原始值 : undefined null 布尔值 数字 字符串 对象引用 : 对象 数组

var s = "hello";
s.toUpperCase();
s                // hello

var a =[];
var b = 啊;
b[0] = 1;
a[0]  // 1
a === b //true

10 类型转换

"7" * "4" //28
var n = 1-"x" //NaN "x"无法转为数字的
n + "object" //NaN object

数组转String 会使用join()方法

11 转换和相等性

null == undefined //true 以下皆为true
//以下相等是因为false转为了数字
"0" == 0
0 == false
"0" == false

但是==从不会将操作数转为布尔值

undefined == false //false

12 显示的类型转换

Number("3");
String(false); //false.toString()
Boolean([]); //true
Object(3); //new Number(3);

x+"" // String(x);
+x or -x //Number(x)
!!x //Boolean(x);

进制转换

var n =17;
binary_string =n.toString(2); //10001
octal_stirng = "0" + n.toString(8) //021
hex_string ="0x"+n.toString(16); //0x11

数字 => 字符串 处理

var n =123456.789;
n.toFixed(0); //"123457"
n.toFixed(2); //"12345679"
n.toExponential(1) //"1.2e+5"
//toPrecision方法将有效数字为转换为字符串,如果有效数字少于数字证书部分的位数,则转为指数形式
n.toPrecision(4); //"1.235e+5"
n.toPrecision(10); //"123456.7890"

字符串 => 数字

parseInt("3 blind mice") //3 会自动跳过前导空格和忽略后面的内容
parseInt("0xFF") //255
parseInt(".1") //NaN
parseInt("0.1") //0
parseFloat(".1") //0.1

//指定基数
parseInt("11",2) //3
parseInt("ff",16) //255

对象转换为原始值

[1,2,3].toString() //"1,2,3"
(function(x) { f(x) ;}).toString(); //function(x) {\n f(x); \n}
/\d+/g.toString() //"/\\d+/g"
new Date(2010,0,1).toString*( // Fri Jan 01 2010 00:00:00 GMT-0800 (PST)

var d= new Date(2010,0,1);
d.valueOf(); //1262332800000

对象转字符串 有toString就执行toString,无toString就执行valueOf,若两者都无,报错.

数组转字符串,同理.不过先尝试valueOf

13作用属性的变量

声明一个全局变量时,用var声明的话是不可配置的

但是没用var 是可以配置的

var truevar = 1;
fakevar = 2;
this.fakevar2 = 3;
delete truevar //false
delete fakevar // true
delete this.fakevar2 // true

14 +运算符

  1. 如果其中一个操作数是对象,则 日期对象通过toString()方法转换,其他对象通过valueOf();
  2. 如果其中一个曹所长是字符串,另外一个操作数也会变成字符串.
  3. 否则,都转为数字进行运输
1 + {} //1[object Object]
true + true //2
2+null = 2;
2+undefined = NaN

15 比较运算符

>=<=不依赖于=====,而只是简单的不小于和不大于这样判断,除了出现NaN,都会返回false;

16 typeof运算符

x typeof x
undefined "undefiend"
null "object"
true/false "boolean"
任意数字和NaN "number"
任意字符串 "string"
任意函数 "function"
任意内置对象(非函数) "object"
任意宿主对象 编译器各自实现,但不是"undefined boolean number string"

17 delete运算符

var o = {x:1};
delete 0.x;
"x" in o //false

var a = [1,2,3,];
delete a[2];
2 in a; //false
a.length //3 会留个洞

delete只能删除自身的属性,不能删除继承的`属性

delete删除不存在的属性也返回true

delete不能删除全局属性

18 use strict

在不支持ECMA 5的浏览器下use strict无任何作用.

支持的话表示代码执行严格模式,满足

  1. 禁止使用with
  2. 所有变量都要先声明,否则报错.
  3. 调用函数(不是方法)中的this值是undefined,(非严格this值总数全局对象) javascript //判断是否严格模式 var has_strict_mode = (function() {"use stricut"; return this === undefiend}); 
  4. 通过callapply调用函数时,this值就是通过call和apply传入的第一个参数;(非扬模式,null和undefined值会被全局对象转换为对象的非对象值代替)
  5. 给补课操作的值创建新成员会报错(非严格止只是操作失败,不会报错)
  6. eval()的代码不能在调用程序所在的上下文声明/定义函数,非严格模式是可以的,相反,变量和函数定义在eval()创建的新作用域中,这个作用域在eval()返回时弃用了
  7. 函数中的arguments对象拥有传入函数值的静态副本,在非严格模式下,arguments里的数组元素和函数参数都是指向同一个值的引用.
  8. delete运算符后面跟非法标识符(变量,函数,函数参数)时,报错,非严格模式下什么也没做,只返回false
  9. 试图删除不可配置的属性将报错
  10. 不允许不进制速
  11. 严格模式下arguments.caller和arguments.callee,会报错.

19 对象

对象类型

  1. 内置对象: ECMAScript定义的对象/类
  2. 宿主对象: JavaScript解析器嵌入的宿主环境(浏览器)
  3. 自定义对象

20 in hasOwnPreperty propertyIsEnumerable

  1. in 检测自有属性/继承属性 返回true
  2. hasOwnPreperty 检测自身属性
  3. propertyIsEnumberable 检测自身属性 & 可枚举

21 getter setter

var p = {
    x:1,
    get r(){return Math(this.x*this.x + this.y*this.y)},
    set r(new_value){
        var old_value = Math.sqrt(this.x*this.x + this.y*this.y );
        var ratio = new_value/old_value;
        this.x *=ratio;
        this.y *=ratio;
    },
    //只读
    get theta(return Math.atan2(this.y,this.x));
}

22 属性的特性

ECMAScript5新增

  1. 可以给原型对象添加方法,并设置成不可枚举
  2. 给对象定义不可删除的属性

属性的特性 1. 值 value 2. 可写性 writable 3. 可枚举性 enumerable 4. 可配置性 configurable

可通过Object.getOwnPropertyDescriptor访问

//{value: 1,writable:true,enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor({x:1},"x");

配置属性描述符
var o ={}
Object.defineProperty(o,"x",{
                        value :1,
                        writable :true,
                        enumerable:false,
                        configurable:true
                    });

o.x //1
Object.keys(o) //[]不可枚举

//修改可写性
Object.defineProperty(o,'x',{writeable:false})

o.x =2 //报错

Object.definePropery(o,'x',{value : 2})//这样修改是OK的

//修改读写器
Object.definePropery(o,'x',{get: function(){return 0;}});

//当`Object.defineProery`要修改多个属性
var p =Object.definePropery({},{
        x :{ value:1},//其他符默认为false或undefined
        y :{value :2}
    }
);

23 对象的三个属性

  1. 原型属性

    原型属性实在实例对象创建之初就设置好的.

    1. 将对象直接量创建的对象使用Object.prototype作为它们的原型.
    2. 通过new创建的对象使用构造函数的prototype属性作为它们的原型.
    3. 通过Object.create()创建的对象使用第一个参数(也可以是null)作为它们的原型
  2. 类属性

    类属性只可以通过toString方式访问.

    返回类似的字符串[object class]

    以下方法可获取class

    function class_of(o){
        if (o === null) return "null";
        if(o === undefiend) return "undefiend";
        return Object.prototype.toString.call(o).slice(8,-1);
    }
  3. 可拓展性

24 数组

24.1 数组方法

  1. 遍历数组之forEach

    function logArrayElements(element, index, array) {
        console.log('a[' + index + '] = ' + element);
    }
    
    // Note elision, there is no member at 2 so it isn't visited
    [2, 5, , 9].forEach(logArrayElements);
    // logs:
    // a[0] = 2
    // a[1] = 5
    // a[3] = 9
  2. 数组方法

    1. join() : 将数组中的所有元素转换为字符串连接在一起,方法第一个参数可以设置分隔符.
    2. reverse() : 返回逆序数组
    3. sort() : 默认按照字母表排序.
    //自定义排序
    var k =[33,4,111,222];
    k.sort(); //1111 222 33 4
    //想第一个参数在前面,返回负数,想在后面,返回正数.
    k.sort(function(a,b){ // 4 33 222 1111
        return a-b;
    });
    1. concat() : 创建并返回一个新数组.
    var a = [1,2,3];
    a.concat(4,5); // [1,2,3,4,5]
    a.concat([4.5]) // [1,2,3,4,5]
    a.concat([4,5],[6,7]) //[1,2,3,4,5,6,7]
    a.concat(4,[5,[6,7]]) //[1,2,3,4,5,[6,7]];
    1. slice() : 返回指定数组的一个片段/子数组
    var a = [1,2,3,4,5];
    a.slice(0,3); //[1,2,3]
    a.slice(3); //[4,5]
    a.slice(1,-1) // [2,3,4]
    a.slice(-3,-2) //[3]
    1. splice() : 在数组插入/删除元素的通用方法
    var a = [1,2,3,4,5,6,7,8];
    a.splice(4); //返回[5,6,7,8] a为[1,2,3,4]
    a.splice(1,2) //返回[2,3] a为[1,4]
    a.splice(1,1) //返回[4] a为[1]
    
    var a = [1,2,3,4,5];
    a.splice(2,0,'a','b');// 返回[] ,a为[1,2,'a','b',3,4,5]
    a.splice(2,2,[1,2],3) //返回[1,2,[1,2],3,3,4,5]

    concat和splice插入时的区别在于splice会插入数组本身.

    1. push pop 在栈尾操作
    2. unshift & shift : 在栈头操作. 注意unshift中的参数是按顺序插入的.
    3. toString toLocaleString

      toString和不使用参数的join作用一致

      toLocacleString 能返回自定义的本地化方法返回字符串.

  3. ECMAScript 5的数组方法

    这些数组方法一般有3个参数,一个个参数

    1. forEach()
    var data = [1,2,3,4,5];
    var sum =0;
    data.forEach(function(value){
        sum += value;
    });
    
    data.forEach(function(value,index,array){
       a[i] = v+1;
    });
    data //[2,3,4,5,6]

    注意forEach无法break停止遍历.,除非放在try里,然后抛出异常

    1. map() : 和forEach类似,但是会把结果放入到一个新数组返回,不会影响旧数组
    a = [1,2,3,];
    b =a.map(function(x){
        return x*x;
    });

    3.fliter() 返回过滤数组,当returntrue时,不过滤此元素

    a = [5,4,3,2,1];
    small_values = a.filter(function(x){ //[2,1]
        return x< 3 ;
    });
    1. every() 和 some() : 判断数组是否全部满足/至少一个满足
    a = [1,2,3,4,5];
    a.every(function(x){ //true
        return x <10;
    });
    
    a.some(function(x){ //true
        return x%2 ==0;
    });

    这两个方法当能觉得返回什么结果时就结束循环

    1. reduce() 和 reduceRight()
    2. indexOf() 和 lastIndexOf() : 返回索引

24.2 数组类型

判断数组类型,typeof对对象除了function都返回object

ECMAScript5 提供 Array.isArray(参数)判断是否为数组

##25 函数

当函数挂载在一个对象上,作为对象的一个属性,当通过这个对象来调用这个函数,该对象就是此次函数调用的上下文,即this

###25.1 创建函数

  1. 函数表达式

    var f =function(){...}
    
    //定义时即调用一次
    var tensquared = (function(x){return x*x;}(10));

    该方式无法在定义之前的语句使用.

  2. 函数声明式

    function distance(x1,y1,x2,y2){...}

    该方式可以在定义之前的语句中调用.

25.2 函数调用

  1. 作为函数

    distance(1,2,3,4,);

    ECMAScript3和非严格ECMAScript5 this的值为全局对象

    严格的ECMAScript5无法调用this

    //判断是否为严格的ECMAScript5
    var strict (function(){return !this;}());
  2. 作为方法

    object_k.method_k();

    作为函数和作为方法调用最大的区别是this

    作为方法调用this为对象的上下文

    var calculator = {
        operand_1 :1,
        operand_2 :1,
        add :function(){
            this.result = this.apperand_1 + this.aperand_2;
        }
    }
    calculator.add();
    //or 下面这种调用好处在于动态选择调用的方法.
    calculator["add"]();
    calculator.result ; //2

    每次用方法调用,都会隐式传入一个实参(调用者的上下文);

  3. 作为构造函数

    var o =new Object();
    //构造函数先创建一个新的空对象
    //这个对象继承构造函数的prototype
    //这个对象的上下文为本对象,而非o
    var new o.m(); 
  4. 通过它们的call()和apply()调用

    在严格模式下,这两个方法第一个实参都会变为this的值.

    //将o中的m方法替换为新方法
    function trace(o,m){
        var =original =o[m];
        o[m] = function(){
            //增加log操作. this指调用trace的对象.
            return original.apply(this,arguments);
        };
    }
    

25.3命名空间

(function(){
    模块代码;
}());

实例: 检测在IE下是否缺少某些变量,有就返回补丁

var extend = (function(){
    for (var p in {toString:null}){
        return function extend(o){
            for(var i =1 length = arguments.length;i<length;i++){
                var source =arguments[i];
                for (var prop in source) o[prop] = source[prop];
            }
            return o;
        };
    }

    return function patched_extend(o){
        for(var i =1 length = arguments.length;i<length;i++){
            var source =arguments[i];
            for (var prop in source) o[prop] = source[prop];
        }

        for(var j=0 ;j<protoprops.length;j++){
            prop =protoprops[j];
            if(source.hasOwnProperty(prop)) o[prop] = source[prop];
        }
        return o;
    };

    var protoprops = ["toString","valueOf","constructor","hasOwnProperty",
        "isPrototypeof","propertyIsEnumerable","toLocalString"
    ];
}());

25.4 闭包

function counter(){
    var n = 0;
    return {
        count:function(){return n++;}
    };
}

var c =counter(), d =counter();
c.count() //0
d.count() //0
d.count() //1
c.count() //1

闭包主要作用是为了让内部嵌套的函数能使用外部的局部变量,并该对象能保持局部变量.当创建了一个对象以后,因为作用域链的原因,对象执行完没有被释放.

javascript的几个问题的更多相关文章

  1. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  4. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  5. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  6. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  7. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  8. JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...

  9. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  10. 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

    CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...

随机推荐

  1. delphi参数传递

    delphi参数传递 参数传递    声明/实现一个过程使用的参数称为形式参数(简称形参),调用过程时传入的参数称为实际参数(简称实参). { Info是形参} procedure ShowInfo( ...

  2. java开发规范总结_代码编码规范

    规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.基本原则 强制性原则:     1.字符串的拼加操作,必须使用StringBuilder:     2.try…catch的用法 try{ }c ...

  3. iphone"此证书是由未知颁发机构签名的"的解决办法

    由于误删除,将开发证书给弄没了,导致Certificates中更新的证书都提示此证书是由未知颁发机构签名的,不能实机调试,解决办法是重新下载AppleWWDRCA.cer 地址是:http://dev ...

  4. 数据库(学习整理)----4--Oracle数据查询(基础点1)

    其他: 计算机中的内存是线性的,一维. length('')计算字符的个数,而不是字节的个数 Oracle中的日期类型和数值类型的数据可以做运算符(>,=,<,<>)比较 如果 ...

  5. List集合的去除重复性练习

    package com.java.b.listdmeo.www; import java.util.ArrayList;import java.util.Iterator; import com.ja ...

  6. vecor预分配内存溢出2

    vector预分配内存溢出导致原始的 迭代器 失效 consider what happens when you add the one additional object that causes t ...

  7. 冒泡排序(C++)

    冒泡排序(C++) 冒泡排序(C++): 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换, ...

  8. 速卖通---发布商品aeopAeProductPropertys这个字段值报07004013的错误

    由于文档的说明很少,导致里面改填写那些值都是靠自己推敲出来,当然可以根据他们的错误提示了研究,他们的错误提示也给出了相关的帮助了, 例如通过categoryid的200000001获取到"i ...

  9. 【PHP】 foreach循环中变量引用的一道面试题

    $a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下 ...

  10. js更新页面,随机更新数字

    代码1: <script> function getRandom(){ var i = Math.random()*40+160; document.getElementById(&quo ...