一、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。
2、word-break:break-all; 用于处理单词折断。(注意与第一个属性的对比)
3、white-space:nowrap; 用于处理元素内的空白,只在一行内显示。
4、overflow:hidden; 超出边界的部分隐藏。
5、text-overflow:ellipsis; 超出部分显示省略号。
四、从输入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时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。
函数节流:使得一定时间内只触发一次函数。原理是通过判断是否有延迟调用函数未执行。
区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次