一、json对象和json字符串相互转换

在数据传输过程中,JSON是以字符串的形式传递的。而JAVAscript操作的是JSON对象。因此,JSON对象和JSON字符串之间需要转换。

1、最常用的就是使用JSON.stringify()和 JSON.parse()这两个函数了,目前JSON对象已经成为JavaScript的内置对象了(Firefox,chrome,opera,safari,ie9,ie8)等浏览器。其中JSON.stringify()函数是将JSON对象转换为字符串,而 JSON.parse()函数恰好相反,是将JSON字符串转换为JSON对象。

注意:当使用JSON.stringify()转换JSON字符串时会出现转义符“\”。当使用JSON.parse()转换JSON对象时会报错传参错误。ie8(兼容模式),ie7和ie6没有JSON对象,推荐采用JSON官方的方式,引入json.js。

2、使用jq的方法    $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象

3、Javascript支持的转换方式:

eval('(' + jsonstr + ')'); //可以将json字符串转换成json对象,注意需要在json字符外包裹一对小括号
注:ie8(兼容模式),ie7和ie6也可以使用eval()将字符串转为JSON对象,但不推荐这些方式,这种方式不安全eval会执行json串中的表达式。

4、JSON官方的转换方式:
http://www.json.org/提供了一个json.js,这样ie8(兼容模式),ie7和ie6就可以支持JSON对象以及其stringify()和parse()方法;可以在https://github.com/douglascrockford/JSON-js上获取到这个js,一般现在用json2.js。

二、js对象和jq对象

题外话:

  window.onload = function () { console.log("这是js的入口函数"); };

  $(document).ready(function () { console.log("这是jquery入口函数的第一种写法"); });

  $(function () { console.log("这是jquery入口函数的第二种写法"); });

使用js的方式获取到的元素就是js对象,使用jq的方式获取到的元素就是jq对象

JS对象,是一个名值对的无序集合。

jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的js对象。
jquery对象,是jquery特有的对象,只有调用jquery框架才存在。其实jquery对象,也是一种js对象。
js对象上的方法,不能直接用在jquery对象上,如果一定要给jquery对象使用js对象的方法,必须把jquery对象转换为js对象。jquery对象,则可以随意使用jquery定义的方法。

jQuery与js相互转换

1、js对象转换成jquery对象。 $(js对象);

2、jquery对象转换成js对象。 (1)jquery对象[索引值] (2)jquery对象.get(索引值)

$()与jQuery()

jQuery中$函数,根据传入参数的不同,进行不同的调用,实现不同的功能。返回的是jQuery对象

jQuery这个js库,除了$之外,还提供了另外一个函数:jQuery

jQuery函数跟$函数的关系:jQuery ===$;

jQuery与js区别

jquery有一层功能皮肤,其内核还是js

注意事项

1、jQuery对象是一个数组。数组中包含着原生JS中的DOM对象,还有其他特有的属性

2、jQuery对象数组中包含的东西很多,但是jQuery对象.length依然是计算原生js中的DOM对象

 css换行的几个属性

1、word-wrap:break-word;

内容将在边界内换行,仅用于块对象,内联对象要用的话,必须要设定height、width或display:block或position:absolute。

 

前端传过来字符串集合怎么接收java 前端传json字符串_JSON

2、word-break:break-all;    用于处理单词折断。(注意与第一个属性的对比)

 

前端传过来字符串集合怎么接收java 前端传json字符串_jQuery_02

3、white-space:nowrap;    用于处理元素内的空白,只在一行内显示。

 

前端传过来字符串集合怎么接收java 前端传json字符串_JSON_03

4、overflow:hidden;    超出边界的部分隐藏。

 

前端传过来字符串集合怎么接收java 前端传json字符串_jQuery_04

5、text-overflow:ellipsis;    超出部分显示省略号。

 

前端传过来字符串集合怎么接收java 前端传json字符串_JSON_05

四、从输入URL到页面加载发生了什么

1、DNS解析

2、TCP连接

3、发送HTTP请求

4、服务器处理请求并返回HTTP报文

5、浏览器解析渲染页面

6、连接结束

五、页面加载时,大致可以分为以下几个步骤:

1、开始解析HTML文档结构

2、加载外部样式表及JavaScript脚本

3、解析执行JavaScript脚本

4、DOM树渲染完成

5、加载未完成的外部资源(如 图片)

6、页面加载成功

六、new操作符做了什么

1、创建一个空的对象

2、链接到原型

3、绑定this指向,执行构造函数

4、确保返回的是对象 

详细:

1、创建一个空对象

var obj = new Object();

2、设置原型链(当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象),让这个空对象的__proto__指向函数的原型prototype

obj.__proto__= Func.prototype;

3、让Func中的this指向obj,并执行Func的函数体。(创建新的对象之后,将构造函数的作用域赋给新对象(因此this就指向了这个新对象))

var result =Func.call(obj);

4、判断Func的返回值类型:

如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象(如果return 出来东西是对象的话就直接返回 return 的内容,没有的话就返回创建的这个对象)

if (typeof(result) == "object"){

  func=result;

}

else{  func=obj;  }

默认情况下函数返回值为undefined,即没有显示定义返回值的话,但构造函数例外,new构造函数在没有return的情况下默认返回新创建的对象。

但是,在有显示返回值的情况下,如果返回值为基本数据类型{string,number,null,undefined,Boolean},返回值仍然是新创建的对象。

只有在显示返回一个非基本数据类型时,函数的返回值才为指定对象。在这种情况下,this所引用的值就会被丢弃了

 

七、Javascript中callee和caller的作用?

 

caller是返回一个对函数的引用,该函数调用了当前函数;

 

callee是arguments的一个属性(arguments另一个属性是length)

 

function test(){
    console.log(arguments.callee)  //返回test函数引用  ƒunction test(){}
    function demo(){
       console.log(arguments.callee);  //返回demo函数引用   ƒunction demo(){}
     }
    demo()
}
test()

 

 

callee是返回正在被执行的function函数,也就是所指定的function对象的正文。
caller返回一个函数被调用的环境

 

function test(){
    demo();
}
function demo(){     
  console.log(demo.caller);  //返回demo被调用的环境   ƒunction test(){demo();}
}
test()

 八、Null和undefined

1、首先看一个判断题:null和undefined 是否相等

    console.log(null==undefined)//true

    console.log(null===undefined)//false

观察可以发现:null和undefined 两者相等,但是当两者做全等比较时,两者又不等。

原因:null: Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。

          undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。

实际上,undefined值是派生自null值的,ECMAScript标准规定对二者进行相等性测试要返回true,

2、那到底什么时候是null,什么时候是undefined呢?

   null表示"没有对象",即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

 

 

 

概念:

函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

1、函数防抖(debounce)

  • 实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
  • 缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟
//防抖debounce代码:
function debounce(fn,delay) {
    var timeout = null; // 创建一个标记用来存放定时器的返回值
    return function (e) {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timeout);
        // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}

// 处理函数
function handle() {
    console.log('防抖:', Math.random());
}    
//滚动事件
window.addEventListener('scroll', debounce(handle,500));

 

2、函数节流(throttle)

  • 实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return
//节流throttle代码:

function throttle(fn,delay) {
    let canRun = true; // 通过闭包保存一个标记
    return function () {
         // 在函数开头判断标记是否为true,不为true则return
        if (!canRun) return;
         // 立即设置为false
        canRun = false;
        // 将外部传入的函数的执行放在setTimeout中
        setTimeout(() => {
        // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。

        // 当定时器没有执行的时候标记永远是false,在开头被return掉
            fn.apply(this, arguments);
            canRun = true;
        }, delay);
    };
}

function sayHi(e) {
    console.log('节流:', e.target.innerWidth, e.target.innerHeight);
}

window.addEventListener('resize', throttle(sayHi,500));

总结:
函数防抖:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否有延迟调用函数未执行。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次