js资料整理(更新中)

1、什么是JavaScript?
JavaScript是客户端和服务器端脚本语言,可以插入到HTML页面中,并且是目前较热门的Web开发语言。同时,JavaScript也是面向对象编程语言。
2、什么是未声明和未定义的变量?
未声明的变量是程序中不存在且未声明的变量。如果程序尝试读取未声明变量的值,则会遇到运行时错误。未定义的变量是在程序中声明但尚未给出任何值的变量。如果程序尝试读取未定义变量的值,则返回未定义的值。
3、什么是全局变量?这些变量如何声明,使用全局变量有哪些问题?
全局变量是整个代码长度可用的变量,也就是说这些变量没有任何作用域。var关键字用于声明局部变量或对象。如果省略var关键字,则声明一个全局变量。
使用全局变量所面临的问题是本地和全局变量名称的冲突。此外,很难调试和测试依赖于全局变量的代码。
4、ViewState和SessionState有什么区别?
“ViewState”特定于会话中的页面。
“SessionState”特定于可在Web应用程序中的所有页面上访问的用户特定数据。
5、什么是===运算符?
===被称为严格等式运算符,当两个操作数具有相同的值而没有任何类型转换时,该运算符返回true。
6、说明如何使用JavaScript提交表单?
要使用JavaScript提交表单,请使用
document.form [0] .submit();
7、元素的样式/类如何改变?
可以通过以下方式完成:
document.getElementById(“myText”).style.fontSize = “20?;

document.getElementById(“myText”).className = “anyclass”;
8、JavaScript中的循环结构都有什么?
For、While、do-while loops
9、如何在JavaScript中将base字符串转换为integer?
parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数。parseInt()将要转换的字符串作为其第一个参数,第二个参数是给定字符串的基础。
为了将4F(基数16)转换为整数,所使用的代码是 :parseInt ("4F", 16);
10、说明“==”和“===”之间的区别?
“==”仅检查值相等,而“===”是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。
11、3 + 2 +“7”的结果是什么?
由于3和2是整数,它们将直接相加。由于7是一个字符串,它将会被直接连接,所以结果将是57。
12、delete操作符的功能是什么?
delete操作符用于删除程序中的所有变量或对象,但不能删除使用VAR关键字声明的变量。
13、JavaScript中有哪些类型的弹出框?
Alert、Confirm and、Prompt
14、如何强制页面加载JavaScript中的其他页面?
必须插入以下代码才能达到预期效果:
<script language="javascript" type="text/javascript">
location.href="http://newhost/newpath/newfile.html"
</script>
15、解释JavaScript中的pop()方法?
pop()方法与shift()方法类似,但不同之处在于Shift方法在数组的开头工作。此外,pop()方法将最后一个元素从给定的数组中取出并返回。然后改变被调用的数组。
例:
var cloths = [“Shirt”, “Pant”, “TShirt”];
cloths.pop();
16、在JavaScript中使用innerHTML的缺点是什么?
如果在JavaScript中使用innerHTML,缺点是:内容随处可见;不能像“追加到innerHTML”一样使用;即使你使用+ = like“innerHTML = innerHTML +'html'”旧的内容仍然会被html替换;整个innerHTML内容被重新解析并构建成元素,因此它的速度要慢得多;innerHTML不提供验证,因此我们可能会在文档中插入有效的和破坏性的HTML并将其中断。
17、break和continue语句的作用?
Break语句从当前循环中退出。
continue语句继续下一个循环语句。
18、在JavaScript中,dataypes的两个基本组是什么?
Primitive
Reference types
原始类型是数字和布尔数据类型。引用类型是更复杂的类型,如字符串和日期。
19、如何创建通用对象?
通用对象可以创建为:
var I = new object();
20、operator类型用来做什么?
'Typeof'是一个运算符,用于返回变量类型的字符串描述。
21、JavaScript中不同类型的错误有几种?
有三种类型的错误:
1、Load time errors:该错误发生于加载网页时,例如出现语法错误等状况,称为加载/间错误,并且会动态生成错误。
2、Run time errors:由于在HTML语言中滥用命令而导致的错误。
3、Logical Errors:这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。
22、在JavaScript中使用的Push方法是什么?
push方法用于将一个或多个元素添加或附加到数组的末尾。使用这种方法,可以通过传递多个参数来附加多个元素。
23、什么是JavaScript中的unshift方法?
Unshift方法就像在数组开头工作的push方法。该方法用于将一个或多个元素添加到数组的开头。
24、对象属性如何分配?
属性按以下方式分配给对象:
obj["class"] = 12;

obj.class = 12;
25、.call()和.apply()之间有什么区别?
函数.call()和.apply()在使用上非常相似,只是有一点区别。当程序员知道函数参数的编号时,使用.call(),因为它们必须在调用语句中被提及为参数。另一方面,当不知道数字时使用.apply(),函数.apply()期望参数为数组。
.call()和.apply()之间的基本区别在于将参数传递给函数。它们的用法可以通过给定的例子进行说明。
var someObject = {
myProperty:'Foo',
myMethod:function(prefix,postfix{
alert(prefix + this.myProperty + postfix);
})
}
someObject.myMethod('<','>');   //alerts'<Foo>'
var someObject = {
myProperty:'Bar'
}
someObject.myMethod.call(someOtherObject,'<','>');   //alerts '<Bar>'
someObject.myMethod.apply(someOtherObject,['<','>']);//alerts '<Bar>'
26、定义事件冒泡?
JavaScript允许DOM元素嵌套在一起。在这种情况下,如果单击子级的处理程序,父级的处理程序也将执行同样的工作。
27、什么样的布尔运算符可以在JavaScript中使用?
“And”运算符(&&),'Or'运算符(||)和'Not'运算符(!)可以在JavaScript中使用。
*运算符没有括号。
28、一个特定的框架如何使用JavaScript中的超链接定位?
可以通过使用“target”属性在超链接中包含所需帧的名称来实现。
<a href=”newpage.htm” target=”newframe”>>New Page</a>
29、如何在不支持JavaScript的旧浏览器中隐藏JavaScript代码?
在<script>标签之后的代码中添加“<! - ”,不带引号。
在<script>标签之前添加“// - >”代码中没有引号。
旧浏览器现在将JavaScript代码视为一个长的HTML注释。而支持JavaScript的浏览器则将 “<! - ” 和 “// - >”作为一行注释。
30、JavaScript的数据类型都有什么?
基本数据类型:String,boolean,Number,Undefined, Null
引用数据类型:Object(Array,Date,RegExp,Function)
31、当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
  直接在DOM里绑定事件:<div οnclick="test()"></div>/
  在JS里通过onclick绑定:xxx.onclick = test
  通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)
那么问题来了,Javascript的事件流模型都有什么?
“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
32、什么是Ajax和JSON,它们的优缺点。
Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。
优点:
  可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量
  避免用户不断刷新或者跳转页面,提高用户体验
缺点:
  对搜索引擎不友好(
  要实现ajax下的前后退功能成本较大
  可能造成请求数的增加
  跨域问题限制
JSON是一种轻量级的数据交换格式,ECMA的一个子集
优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)
33.看下列代码输出为何?解释原因。
var a;
alert(typeof a); // undefined
alert(b); // 报错
解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
34、看下列代码,输出什么?解释原因。
vara=null;
alert(typeofa);//object
解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
35、看下列代码,输出什么?解释原因。
var undefined;
undefined == null; // true
1 == true;   // true
2 == true;   // false
0 == false;  // true
0 == '';     // true
NaN == NaN;  // false
[] == false; // true
[] == ![];   // true
undefined与null相等,但不恒等(===)
一个是number一个是string时,会尝试将string转换为number
尝试将boolean转换为number,0或1
尝试将Object转换成number或string,取决于另外一个对比量的类型
所以,对于0、空字符串的判断,建议使用 “===” 。“===”会先判断两边的值类型,类型不匹配时为false。
36、看下面的代码,输出什么,foo的值为什么?
varfoo="11"+2-"1";
console.log(foo);
console.log(typeoffoo);
执行完后foo的值为111,foo的类型为String。
37、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
vard=newDate();
//获取年,getFullYear()返回4位的数字
varyear=d.getFullYear();
//获取月,月份比较特殊,0是1月,11是12月varmonth=d.getMonth()+1;
month=month<10?'0'+month:month;
//获取日
varday=d.getDate();
day=day<10?'0'+day:day;
alert(year+'-'+month+'-'+day);
38、怎样添加、移除、移动、复制、创建和查找节点
1)创建新节点
createDocumentFragment()    //创建一个DOM片段
createElement()   //创建一个具体的元素
createTextNode()   //创建一个文本节点
2)添加、移除、替换、插入
appendChild()      //添加
removeChild()      //移除
replaceChild()      //替换
insertBefore()      //插入
3)查找
getElementsByTagName()    //通过标签名称
getElementsByName()     //通过元素的Name属性的值
getElementById()        //通过元素Id,唯一性
39、实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
//方法一:
Object.prototype.clone=function(){
        varo=this.constructor===Array?[]:{};
        for(vareinthis){
                o[e]=typeofthis[e]==="object"?this[e].clone():this[e];
        }
        returno;
}
//方法二:
/**    
* 克隆一个对象   
* @param Obj    
* @returns 
*/
    functionclone(Obj){  
        varbuf;  
        if(ObjinstanceofArray){  
            buf=[];                    //创建一个空的数组
            vari=Obj.length;  
            while(i--){  
                buf[i]=clone(Obj[i]);  
            }  
            returnbuf;    
        }elseif(ObjinstanceofObject){  
            buf={};                  //创建一个空对象
            for(varkinObj){          //为这个对象添加新的属性
                buf[k]=clone(Obj[k]);  
            }  
            returnbuf;  
        }else{                        //普通变量直接赋值
            returnObj;  
        }  
    }
40、如何消除一个数组里面重复的元素?
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
    function deRepeat(){
        var newArr=[];
        var obj={};
        var index=0;
        var l=arr.length;
        for(var i=0;i<l;i++){
            if(obj[arr[i]]==undefined)
              {
                obj[arr[i]]=1;
                newArr[index++]=arr[i];
              }
            else if(obj[arr[i]]==1)
              continue;
        }
        return newArr;


    }
    var newArr2=deRepeat(arr);
    alert(newArr2); //输出1,2,3,4,5,6,9,25


    var arr = [1,2,3,4,1,2];  
         function removeArr(arr){  
             var tmp = {};  
             var newArr = [];  
             for(i=0;i < arr.length; i++){  
                 if(!tmp[arr[i]]){  
                     tmp[arr[i]] = true;  
                     newArr.push(arr[i]);  
                 }  
             }  
             console.log(newArr);  
         }  
         //removeArr(arr);  
41、(设计题)想实现一个对页面某个节点的拖曳?如何做?(使用原生JS)
回答出概念即可,下面是几个要点
给需要拖拽的节点绑定mousedown, mousemove, mouseup事件
mousedown事件触发后,开始拖拽
mousemove时,需要通过event.clientX和clientY获取拖拽位置,并实时更新位置
mouseup时,拖拽结束
需要注意浏览器边界的情况
42、用typeof bar===”object”判断bar是否是一个object的潜在缺陷是什么?怎样才能避免这种缺陷?
尽管用typeof bar===‘object’是一个判断bar是一个object的可靠方法但是令人惊讶的是,在JavaScript中null也是一个object!
因此,以下的代码会让很多开发者惊讶,log显示true,而不是false.
var bar = null;
console.log(typeof bar === "object");  // logs true!
只要你意识到这些,这个问题就能通过判断bar是否为null轻松避免:
console.log((bar !== null) && (typeof bar === "object"));  // logs false
为了使我们的答案更加完全、彻底的解决这个问题,还有两件事需要说明:
首先:上面的解决方案里,如果bar是一个function,也会返回false,通常情况下,这是我们期望的,但是在某些情况下,我们希望当bar是function时,也返回true,你就需要修改上面的解决方案如下:
console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function")));
其次:如果bar是一个array(var bar=[]),也会返回true,大多情况下,这是我们想要的结果,因为arrays的确是objects。但是如果当bar为arrays,你想返回false,你就需要修改上面的解决方案如下:
console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]"));
或者用jQuery如下:
console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));
43、简要描述null和undefined的区别
null :是JavaScript的关键字,用于描述”空值”,对其执行typeof操作,返回”object”,即为一个特殊的对象值,可以表示数字、字符串和对象时”无值”的。
undefined :是预定义的全局变量,其值为”未定义”,它是变量的一种取值,表示变量没有初始化。当查询对象属性、数组元素的值时,如果返回undefined则表示属性或者元素不存在;如果函数没有任何返回值,也返回undefined。
需要注意的是,虽然null和undefined是不同的,但是因为都表示”值的空缺”,两者可以互换。因此,使用”==”任务二者是相等的,需要使用”===”来区分它们。
44、阅读如下代码:
var x=10;
var y=20;
var z=x<y?x++:++y;

上述代码运行后,变量x、y、z的值是多少?

上述代码运行后,变量想x的值为11;变量y的值为20;变量z的值为10。
这是因为,运行第三行代码时,只执行?后的第一个语句,因此,y的值不发生变化,仍为20;并返回x的值赋值给变量z,因此z的值为10,然后将x的值增加1,变为11。
45、什么是”逻辑短路”?
逻辑短路时对于逻辑运算而言,是指仅计算逻辑表达式中的一部分便能缺点结果,而不对整个表达式进行计算的现象。
对于”&&”运算符,当第一个操作数为false时,将不会判断第二个操作数,吧、因为此时无论第二个操作数为何,最后的运算结果一定是false;
对于” || ”运算符,当第一个操作数为true时,将不会判断第二个操作数,因为此时无论第二个操作数为何,最后的运算结果一定是true。
46、什么是JavaScript中的函数作用域
JavaScript中的函数作用域是指:变量在声明它的函数体以及这个函数体嵌套的任意函数体内都有定义的。这意味着,在函数体内声明的所有变量在整个函数体内始终是可见的,这种特性也被称为“声明提前”,即函数内声明的所有变量(不涉及到赋值)都被提前至函数的顶部声明。
比如,查看如下代码:
function test(){
console.log(x);
var x=10;
console.log(x);
}
test();
上诉代码运行,将先输出undefined,再输出10.
这是因为,虽然变量x在第二行声明并赋值,丹其有效范围为整个函数体,因此,第一行代码输出时,表示变量x已经声明但是没有赋值,因此输出undefined;第三行代码运行时,因为变量x已经赋值为10,则输出10。
47、简要描述JavaScript中定义函数的几种方式
JavaScript中,有三种定义函数的方式:
函数语句:即使用function关键字显示定义函数。如:
function f(x){return x+1;}
函数定义表达式:也称为“函数直接量”。如:
Var f=function(x){return x+1;}
使用Function()构造函数定义。如:
var f=new Function(“x”,”return x+1;”);
48、什么是栈?在JavaScript中,如何模拟栈操作?
栈(stack)是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
在JavaScript中,可以使用数组及其相关操作来模拟栈操作。首先,使用数组存储一列元素,然后使用数组的push()方法在数组的尾部添加指定的元素,类似于在栈顶添加元素,即顶部入;然后使用数组的pop()删除并返回数组尾部的元素,类似于顶部出栈,即后入的元素先出。
49、简要描述JavaScript中的匿名函数
匿名函数是指在定义时没有指定名字的函数,且定义后往往直接调用。如:function(num1, num2){console.log( num1 + num2 );}这种方式所定义的匿名函数,往往需要直接调用,如:(function (num1, num2) {console.log(num1 + num2);})(10,20);匿名函数常用于定义不需要重复使用的函数,用完即释放。另外,对于直接调用的匿名函数而言,可以看成是一个临时的命名空间,其区域内定义的所有变量,不会污染到全局命名空间。
50、简要描述JavaScript 中的作用域链
任何一段JavaScript代码都对应一个作用域链,作用域链中存放一系列对象,代码中声明的变量将作为对象的属性存放。
在JavaScript的顶层代码中,作用域链由一个全局对象组成;当定义一个函数时,它保存一个作用域链,作用域链上有两个对象,一个是函数对象,一个是全局对象。每当一个函数被调用时,会创建一个活动对象(也叫上下文对象),函数中的局部变量将作为该对象的属性存放。当需要使用一个变量时,将从作用域链中逐个查找对象的属性。比如:要使用变量a,将先查找作用域中的第一个对象是否有属性a,如果有就使用;如果没有就查找作用域链中下一个对象的属性,以此类推。如果作用域链上没有任何一个对象含有属性x,则认为这段代码的作用域链上不存在x,将抛出引用错误异常。当函数调用完成后,如果没有其他引用指向为此次调用所创建的上下文对象,该对象将被回收。
51、简要描述你对闭包的理解
函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性称为闭包。这意味着函数变量可以隐藏于作用域链之内,看起来好像是函数将变量包裹了起来。这种方式常用于共享函数内的私有变量。
52、闭包有如下应用特征:
1、局部变量:在函数中定义有共享意义(如:缓存、计数器等)的局部变量(注:定义成全局变量会对外造成污染);
2、内嵌函数:在函数中声明有内嵌函数,内嵌函数对函数中的局部变量进行访问;
3、外部使用:函数向外返回此内嵌函数,外部可以通过此内嵌函数持有并访问声明在函数中的局部变量,而此变量在外部是通过其他途径无法访问的。
53、变量提升
var s = 1;  
         function a (){  
             //console.log(s);//undefined  
             var s = 3;  
             //console.log(s++);//3  
         }  
         function b(){  
             //console.log(s);//1  
             s++;  
             //console.log(++s);//3  
         }  
         if(100 < 0 <0){  
             a();  
         }else{  
             b();  
         }  
         if(0 < 1 < (0+4)){  
             a();  
         }else{  
             b();  
         }  
54、冒泡排序
var bubbleArr = [1,3,4,2,6];  
           function bubble (bubbleArr){  
               var tmp;  
               for(var i = 0,j = bubbleArr.length; i < j; i++){  
                   for(var k = 1; k < i; k++){  
                       if(bubbleArr[i] < bubbleArr[k]){  
                           tmp = bubbleArr[i];  
                           bubbleArr[i] = bubbleArr[k];  
                           bubbleArr[k] = tmp;  
                       }  
                   }  
               }  
               console.log(bubbleArr);  
           } 
55、字符串倒序
var str = "1,3,4,5,6,7,8";  
          console.log(str.split(",").reverse().join(" "))  
          var string = str.split("").reverse().join('');  
          str.split("")//把字符串分割成数组,如果无参数则每个元素都会被分割,有参数以参数分割  
  
          console.log(string);
          
网上有人分享经验,说到学习前端开发技术JavaScript很实用的一些书籍,从入门到高级,一一列举,很不错。整理了一下发上来。 名称: JavaScript+DOM编程艺术.pdf 概述: “本书理应奉为经典。文笔清晰,采用了优秀的编程原则,严格遵守相应的标准。真是完美的结合。” ——Slashdot “我要隆重推荐本书。它前所未有地演示了DOM脚本编程的真正潜力。无论你是JavaScript新手还是专家,本书都绝对必读。”——Garrent Dimon,Digital-Web.com 随着Ajax的兴起,JavaScript再一次成为炙手可热的技术。然而,在历史上,它并不是一直这么幸运,由于主流浏览器之间的不兼容,以JavaScript为核心的DHTML曾经昙花一现,很快被人遗忘。 俱往矣,如今的网页设计已经翻开了新的一页。在CSS彻底改变了Web页面布局的方式之后,万维网联盟跨浏览器的DOM标准的制定,使JavaScript终于突破瓶颈,成了大大改善网页用户体验的利器。 本书在简洁明快地讲述JavaScript和DOM的基本知识之后,过几个实例演示了大师级的网页开发技术,并透彻阐述了一些至关重要的JavaScript编程原则和最佳实践,包括预留退路、循序渐进和以用户为心等。读者可以非常直观地加以领悟,迅速使自己的编程技术更上一层楼。 第1章 JavaScript简史  1.1 JavaScript的起源  1.2 浏览器之争  1.3 制定标准  1.4 小结 第2章 JavaScript语法  2.1 准备工作  2.2 语法  2.3 语句  2.4 变量  2.5 操作  2.6 条件语句  2.7 循环语句  2.8 函数  2.9 对象  2.10 小结 第3章 DOM  3.1 文档:DOM的“D”  3.2 对象:DOM的“O”  3.3 模型:DOM的“M”  3.4 趁热打铁  3.5 小结 第4章 案例研究:JavaScript美术馆  4.1 编写标记语言文档  4.2 编写JavaScript函数  4.3 JavaScript函数的调用  4.4 对JavaScript函数进行功能扩展  4.5 小结 第5章 JavaScript编程原则和良好习惯  5.1 不要误解JavaScript  5.2 预留退路  5.3 向CSS学习  5.4 分离JavaScript  5.5 向后兼容性  5.6 小结 第6章 案例研究:JavaScript美术馆改进版  6.1 快速回顾  6.2 解决“预留退路”问题  6.3 解决“分离JavaScript”问题  6.4 JavaScript函数的优化:不要做太多的假设  6.5 DOM Core和HTML-DOM  6.6 小结 第7章 动态创建HTML内容  7.1 [removed]()方法  7.2 innerHTML属性  7.3 DOM提供的方法  7.4 重回“JavaScript美术馆”  7.5 小结  7.6 下章简介 第8章 充实文档的内容  8.1 不应该做的事情  8.2 把“不可见”变成“可见”  8.3 原始内容  8.4 XHTML文档  8.5 CSS  8.6 JavaScript代码  8.7 小结  8.8 下章简介 第9章 CSS-DOM  9.1 三位一体的网页  9.2 style属性  9.3 何时该用DOM脚本去设置样式信息  9.4 className属性  9.5 小结 第10章 用JavaScript实现动画效果  10.1 何为动画  10.2 实用的动画  10.3 改进动画效果  10.4 最后的优化  10.5 小结 第11章 学以致用:JavaScript网站设计实战  11.1 案例背景介绍  11.2 页面视觉效果设计  11.3 CSS  11.4 颜色  11.5 XHTML文档  11.6 JavaScript脚本  11.7 小结  11.8 下章简介 第12章 展望DOM脚本编程技术  12.1 Web的现状  12.2 Ajax技术  12.3 Web应用  12.4 小结 附录 DOM方法和属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值