二——01Day:对象的索引理解,对象上的this指向,对象转换为字符串,函数的预解析,arguments.callee的用法,

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二——01Day:对象的索引理解,对象上的this指向,对象转换为字符串,函数的预解析,arguments.callee的用法,相关的知识,希望对你有一定的参考价值。

键值对,一个键对应一个值
键必须是字符型或 symbol 型,如果不是则隐式转换为字符串
键不能重复,如果重复则会覆盖

var s = "b-1";
var obj = 
    a: 1,
    //用于非纯数字或字母
    ["b"]: 2, //相当于 b : 2,但是可以放入变量
    [s]: 3,
    "a-1": 4, //不能使用变量
;

任何对象转换为字符串都会转换为[object Object]

var o = a: 1; //[object Object] ,任何对象转换为字符串都会转换为[object Object]
var o1 = a : 2;
var obj3 = ;
obj[o] = 10;
console.log(obj[o1]); //10,o1 被转换为了 [objec Object]
var obj4 = a: 1;
var arr = ["a"];
console.log(obj4[arr]); //1,数组中只有一个元素,被转换为 "a"

使用 for in 时,key 自动转换为字符串,并可以打印除所有除索引外的其他属性
此种遍历时,会跳过空元素,不会打印
forEach 遍历时会跳过空元素

var arr = [1, 2, 3, 4];
arr.a = 1;
//不可遍历不可枚举属性
for(var key in arr)
    console.log(key, arr[key]);

this指向

var a = 10;
var obj6 = 
    a: 1,
    b: this.a, //10,属性上的 this,指向当前对象外上下文环境中的 this
    c: function()
        console.log(this.a); //谁调用这个方法,this 指向谁
    


obj6.c(); //1

null 用来在垃圾回收时,可以将不使用的引用类型回收掉

var obj7 = a: 1, b: 2;
console.log(obj7); //10,2(其实已经修改了)
obj7.a = 10;

将对象转换为字符串

//将对象转换为字符串
var obj8 = a: 1, b: 2;
console.log(JSON.stringify(obj8));
var str = JSON.stringify(obj8)
console.log(JSON.parse(str));

纯函数,函数体本身是抽象的、独立的,不会对函数外的变量或者其他内容有影响

function fn(a, b)
    a++;
    b++;
    //局部变量,当函数执行完毕后会被释放
    return a + b;


var s = fn(3, 5);
console.log(s); //10

非纯函数

var a = 1, b = 2;
function fn1()
    a++;
    b++;
    return a + b;

声明式预解析,预赋值

var a = 1;
function a()
    console.log(a);

a(); // a is not a function
var a;
function a()
	  onsole.log(a);

a(); //函数本身

console.log(a); //undefined,函数在代码块中预解析
var a = 1;

    console.log(a); //函数本身,在块开始时预解析、预赋值
    a = 2;
    function a()

    

console.log(a); //2
var a = 1;
   if(a === 2)
       function a()
           console.log("aa");
       
   
   a(); //a is not a function
var a;
if(a === undefined)
    function a()
        console.log("aa");
    

a(); //aa
var a = 1;

    a = 2;
    function a()

    
    a = 3;
    function a()

    
    a = 4;
    function a()

    
    a = 5;
    console.log(a); //5

console.log(a); //4
/*
同名函数在块内预解析、预赋值的同时将同名函数上的
同名变量挤出快外,在块语句结束后赋值
*/

地址的引用

function fn(o)
    o.a = 10;
    //o = a: 10;
    //若写成这样,输出为1


var obj = a: 1;
fn(obj);
console.log(obj); //10

this指向

function fn(f)
     arguments[0](); //this 指向 arguments
     f(); //this 指向 window
 
 function fn1()
     console.log("aa");
     console.log(this);
 
 fn(fn1); //aa

回调循环

var a = 1;
function fn1(f)
    a++;
    console.log(a); //2, 3, 4, 5, 6, 7, 8, 9, 10
    f(fn1);

function fn2(f)
    if(a < 10) f(fn2);

fn1(fn2);

不需要全局变量,解耦(不使用全局变量,使用纯函数)

function fn1(f, a)
    if(!a) a = 1;
    a++;
    console.log(a); //2, 3, 4, 5, 6, 7, 8, 9, 10
    f(fn1, a);


function fn2(f, a)
    if(a < 10) f(fn2, a);


fn1(fn2);

防止内存泄漏

console.log("aa");
var ids = setTimeout(fn, 1000);
console.log("cc");

function fn()
    clearTimeout(ids); //防止内存泄露
    console.log("bb");

arguments.callee的用法

argument为函数内部对象,包含传入函数的所有参数,arguments.callee代表函数名,多用于递归调用,防止函数执行与函数名紧紧耦合的现象,对于没有函数名的匿名函数也非常起作用。举例如下:

function showRed(fn1, fn2)
    var f = arguments.callee; //函数本身
    //arguments.callee 执行该函数的上下文执行环境,指向调用他的对象
    setTimeout(function()
        console.log("红灯");
        fn1(fn2, f);
    , 2000);   


function showYellow(fn1, fn2)
    var f = arguments.callee;
    setTimeout(function()
        console.log("黄灯");
        fn1(fn2, f);
    , 1000);
    


function showGreen(fn1, fn2)
    var f = arguments.callee;
    setTimeout(function()
        console.log("绿灯");
        fn1(fn2, f);
    , 3000);


showRed(showYellow, showGreen);

while, 递归 深度遍历

var a = 1;

function fn()
    a++;
    console.log(a); //1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    if(a < 10) fn();
    console.log(a); //此时输出 10 个 10

//尾递归,递归后面没有代码
fn();
function fn(a, sum)
    if(a >= 100) return sum
    if(!sum) sum = 0;
    if(!a) a = 0;
    a++;
    sum += a;
    return fn(a, sum);

fn();//5050
function fn(a, sum)
    if(a >= 100) return sum
    if(!sum) sum = 0;
    if(!a) a = 0;
    a++;
    sum += a;
    return arguments.callee(a, sum);

console.log(fn());

深度遍历

//深度遍历
function fn(obj)
    for(var key in obj)
        if(typeof obj[key] === 'object' && obj[key] !== null)
            fn(obj[key]);
         else 
            console.log(key, obj[key]);
        
    


var o = 
    a: 1,
    b: 
        c: 2,
        d: 
            e: 3,
            f: 4
        
    


fn(o);
var keys = Object.keys(o); //获取对象所有的 key 组成的数组
var values = Object.values(o); //获取对象的 key 对应的值组成的数组

数据转换

除字符串以外的任何类型,与数值相加,都会转换为数值类型
字符串与任何类型相加,其他类型都会转为字符串
使用引用类型与数值相加时,引用类型自动转换为字符串

var a = 3;
var b = ;
console.log(a + b); //3[object Object]

var c = [1];
console.log(a + c); //31

引用类型在隐式转换类型时,都会转换为 NaN,但是数组是特殊的,优先转换为字符串,然后再转换为数值,所有引用类型转换布尔值为 true

var d = true;
console.log(a - d); //2

var e = ;
console.log(a - e); //NaN

var f = [1];
console.log(a - f); //2
console.log([3] - [2]); //1
console.log([3] + [2]); //32
//二维数组依旧先转换为字符串,后转换为数值
console.log([[3]] - 1); //2
//等号赋值返回赋值结果
var a = 1;
if(a = 2)
    a++;

console.log(a); //3

单运算符

相与

 console.log(3 & 4); //0
 console.log(0xAAFF & 0xFF); 
 //任何数与 0xFF 相与,得到的是不大于 255 的数值;0xFF = 255

或运算

 console.log(3 | 4); //7

 console.log(1231 | 0xFF); 
 //任何数与 0xFF 进行或运算,得到的是不小于 255 的值,小于 255 的值都会等于 255

异或

console.log(3 ^ 4); //7
/*
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1
相同为 0,不同为 1
*/

//可用于加密
console.log(16256 ^ 12345); //4025
console.log(4025 ^ 12345); //16256

console.log(~3); // +1 取负,-4

取反

console.log(~3); // +1 取负,-4
var arr = [1, 2, 3];
if(~arr.indexOf(3))
    console.log("查找到了");

//取整,非运算符不运算小数
console.log(~~3.6); //3,向下取整
//将隐式转换为 NaN 的值转换为 0 
console.log(~~"a"); //0
var a = 1;
console.log(a += 3 ? 1 : 2); //2
console.log(3 ? 1 : 2);
//三目运算符优先级高于 += 运算符,先计算三目运算符
console.log(a += 0 ? 1 : 2); //4

console.log([] == false); //true, [] 为 false
console.log([1] == 1); //true, [1] 转换为字符 1
console.log([0] == false); //true,[0] 转换为字符 0
console.log([] == []); //false,两个空数组地址不一样
console.log([] == ![]); //true,引用类型转换为布尔值为 true,![] 为 false

跳转

var i = 1;
aa: //label
while(i++ <= 100)
    var j = 2;
    while(j < i)
        if(i % j === 0) continue aa; // break 和 continue 可以跳转到外层 label 中
        j++;
    
    console.log(i);        

以上是关于二——01Day:对象的索引理解,对象上的this指向,对象转换为字符串,函数的预解析,arguments.callee的用法,的主要内容,如果未能解决你的问题,请参考以下文章

JAVA入门零基础小白教程day06-类和对象

面向对象day07:面向对象和类

python Day01

Review cpp day05

Day4 MySql触发器视图索引以及设计优化

面向对象之封装(day7)