js语言基础,js基础语法大全
其实js语言基础的问题并不复杂,但是又很多的朋友都不太了解js基础语法大全,因此呢,今天小编就来为大家分享js语言基础的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
js语言的特点 老师作业
JS语言特征(来自Pro Javascript Techniques)
1、引用
引用指向的只能是具体的对象,而不是另一个引用。在执行字符串链接操作时,结果总会是一个新的字符串对象,而非原字符串的修改版本。
2、函数重载和类型检查
函数重载必须依赖两件事情:判断传入参数数量的能力和判断传入参数类型的能力。
1.判断传入参数数量
JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量(contextual variable)称为参数(argument),它是一个包含所有传给函数的参数的伪数组(pseudo-array),所以它并非真正意义的数组(也就是说你不能修改它,也不能用push()来添加新元素),但可以访问其中的元素,也具有.length属性。
2.判断传入参数类型
JavaScript的类型检查有两种特别有用的方法:
第一种方法是使用typeof操作符。这个工具提供了一个字符串名称,用于表达变量内容的类型。当变量不是object或array类型时,这是最完美的解决方法了。但是对于自定义的对象就不能用这个方法进行类型检查,因为它只返回object,很难跟其他的object区分开来。
第二种检查对象类型的方法,需要引用所有JavaScript对象都带有的一个属性,称为构造函数(construstor)。这个属性引用的是原本用来构造该对象的那个函数。
3、作用域
在Javascript里,作用域是由函数划分的,而不是由块(block)划分的。基于浏览器的Javascript的一个有趣特征是,所有属于全局作用域的变量其实都是window对象的属性。如果变量没有显式定义,它就是全局定义的,虽然它可能只在这个函数作用域的范围内使用。
闭包
闭包(closure)意味着内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。
闭包能实现的额外作用:
1、在一些函数式程序设计语言里,有一种称为Curry化的技术。本质上,Curry化是一种通过把多个参数填充到函数体中,实现将函数转换为一个新的经过简化的(使之接受参数更少)函数的技术。
function addGenerator(num)
{
//返回一个函数
return function(toAdd)
{
return num+toAdd;
};
}
var addFive=addGenerator(5);
aler(addFive(4)==9);
2、通过自执行的匿名函数你可以把所有原本属于全局的变量都隐藏起来。
(
function()
{
//这个变量如果没有用自执行的匿名函数包围起来那么它就是全局的
var msg="Thanks for visiting!";
window.onunload=funtion()
{
alert(msg);
};
}
)();
3、使用匿名函数来激发出创建多个使用闭包的函数所需的作用域
var obj=document.getElementById("main");
var items=["click","keypress"];
for(var i=0;i<items.length;i++)
{
(
function()
{
var item=item[i];
obj["on"+item]=funciton()
{
alert("Thanks for your"+item);
};
}
)();
}
4、上下文对象
在Javascript中,代码总是有一个上下文对象(代码处在该对象内)。上下文对象是通过this变量体现的,这个变量永远指向当前代码所处的对象中。全局对象其实是window对象的属性。这意味着即使是在全局上下文中,this变量也能指向一个对象。Javascript提供了call和apply两个方法,可以使用这两个方法改变上下文对象。
Js基础算法有哪些
这次给大家带来Js基础算法有哪些,使用Js基础算法的注意事项有哪些,下面就是实战案例,一起来看一下。
素数
Q:你将如何验证一个素数?
A:一个素数只能被它自己和1整除。所以,我将运行一个while循环并加1。(看代码示例,如果你无法理解,那这不是你的菜。先回去学习javaScript基础知识然后再回来吧。)
方法1
function isPrime(n){
var pisor= 2;
while(n> pisor){
if(n% pisor== 0){
return false;
}
else
pisor++;
}
return true;
}
isPrime(137);//= true
isPrime(237);//= falseQ:你能做得更好吗?
A:可以。除数一次增加1个。在3之后我可以增加2.如果一个数可以被任何偶数整除,它将被2整除。
补充:如果你不需要把除数增加到这个数。你可以更早停止。让我在下面的步骤中解释一下(如果需要可以多读几遍)
第一步,任何数字都不能被大于它的一半的数字整除。例如,13将永远不能被7,8,9整除??它甚至可以是偶数的一半。例如,16将被8整除,但永远不会被9,10,11,12??
结论:一个数字将永远不能被一个大于其一半数值的数字整除。所以,我们可以少循环50%。
第二步,现在,如果一个数字不能被3整除。(如果它可被3整除,那么它就不是质数)。然后,它不可以被大于其值1/3的任何数整除。例如,35不能被3整除。因此,它永远不会被大于35/3的数整除,永远不能被12, 13, 14整除?如果你取一个像36一样的偶数,它将永远不能被13, 14, 15整除。
结论:一个数字可以被其数值的三分之一整除。
第三步,例如,你有一个数字127。127不能被2整除,因此你最多应该检查63.5。其次,127不能被3整除。因此,您将检查到127/3大约42。它不能被5整除,除数应该小于127/5大约25,而不是7。那么,我们该在哪里停下来?
结论:除数将小于math.sqrt(N)
方法2
如果你不能理解也不用担心,别管它。如果那你不是一个研究人员就没关系。
function isPrime(n)
{
var pisor= 3,
limit= Math.sqrt(n);
//check simple cases
if(n== 2|| n== 3)
return true;
if(n% 2== 0)
return false;
while(pisor<= limit)
{
if(n% pisor== 0)
return false;
else
pisor+= 2;
}
return true;
}
isPrime(137);//= true
isPrime(237);//= false素数因子
Q:如何求出一个数的所有素数因子?
A:执行一个while循环。开始除以2,如果不能整除,记录这个除数,直到完成。
function primeFactors(n){
var factors= [],
pisor= 2;
while(n>2){
if(n% pisor== 0){
factors.push(pisor);
n= n/ pisor;
}
else{
pisor++;
}
}
return factors;
}
primeFactors(69);//= [3, 23]Q:运行时间复杂度是多少?你能做得更好吗?
A:O(n)。可以将除数从3开始,累加2。因为,如果一个数被任何偶数整除,它将被2整除。因此,你不需要除以偶数。此外,你不会有一个大于其价值一半的因素。如果你想让它变得复杂,那就用第一题的补充概念吧。
Fibonacci(斐波那契)
Q:如何获得第n个斐波纳契数字?
A:我创建一个数组并从迭代开始。
斐波那契系列是面向初学者的最受欢迎的面试问题之一。所以,你必须学习这一个。
方法1
function fibonacci(n){
var fibo= [0, 1];
if(n<= 2) return 1;
for(var i= 2; i<=n; i++){
fibo[i]= fibo[i-1]+fibo[i-2];
}
return fibo[n];
}
fibonacci(12);//= 144Q:运行时间复杂度是多少?
A: O(n);
Q:你能让它递归吗?
方法2
function fibonacci(n){
if(n<=1){
return n;
} else{
return fibonacci(n-1)+ fibonacci(n-2);
}
}
fibonacci(12);//= 144Q:运行时间复杂度是多少?
A: O(2n);关于时间复杂度的细节
最大公约数
Q:你会如何找到两个数字的最大公约数?
function greatestCommonpisor(a, b){
var pisor= 2,
greatestpisor= 1;
//if u pass a-ve number this will not work. fix it dude!!
if(a< 2|| b< 2)
return 1;
while(a>= pisor&& b>= pisor){
if(a%pisor== 0&& b% pisor==0){
greatestpisor= pisor;
}
pisor++;
}
return greatestpisor;
}
greatestCommonpisor(14, 21);// 7
greatestCommonpisor(69, 169);//= 1算法范式
很抱歉。我也无法解释它。因为我自己80%的情况下都不能理解它。我的算法分析教练告诉我这个,又从课堂笔记偷走(我是一个好学生,顺便说一句!)
function greatestCommonpisor(a, b){
if(b== 0)
return a;
else
return greatestCommonpisor(b, a%b);
}注意:用你的大脑来理解它。
去重
Q:你将如何从数组中删除重复的成员?
A:执行一个循环,并保存一个对象/关联数组。如果我第一次找到一个元素,我会设置它的值为真(这将告诉我元素添加一次)。如果我在对象中找到这个元素,我不会将它插入到返回数组中。
function removeDuplicate(arr){
var exists={},
outArr= [],
elm;
for(var i=0; i<arr.length; i++){
elm= arr[i];
if(!exists[elm]){
outArr.push(elm);
exists[elm]= true;
}
}
return outArr;
}
removeDuplicate([1,3,3,3,1,5,6,7,8,1]);//= [1, 3, 5, 6, 7, 8]合并两个排序的数组
Q:怎样合并两个已排序数组?
A:我将为每个数组保留一个指针(看代码,并注意这个)。
function mergeSortedArray(a, b){
var merged= [],
aElm= a[0],
bElm= b[0],
i= 1,
j= 1;
if(a.length==0)
return b;
if(b.length==0)
return a;
/*
if aElm or bElm exists we will insert to merged array
(will go inside while loop)
to insert: aElm exists and bElm doesn't exists
or both exists and aElm< bElm
this is the critical part of the example
*/
while(aElm|| bElm){
if((aElm&&!bElm)|| aElm< bElm){
merged.push(aElm);
aElm= a[i++];
}
else{
merged.push(bElm);
bElm= b[j++];
}
}
return merged;
}
mergeSortedArray([2,5,6,9], [1,2,3,29]);//= [1, 2, 2, 3, 5, 6, 9, 29]不通过临时变量交换两个数的值
Q:如何在不使用临时变量的情况下交换两个数字?
function swapNumb(a, b){
console.log('before swap:','a:', a,'b:', b);
b= b-a;
a= a+ b;
b= a-b;
console.log('after swap:','a:', a,'b:', b);
}
swapNumb(2, 3);
//= before swap: a: 2 b: 3
//= after swap: a: 3 b: 2位操作:对不起,我无法向你解释这一点。 Kinjal Dave建议到 logical conjunction理解它。将浪费您30分钟。
function swapNumb(a, b){
console.log("a:"+ a+" and b:"+ b);
a= a ^ b;
b= a ^ b;
a= a ^ b;
console.log("a:"+ a+" and b:"+ b);
}
swapNumb(2, 3);
//= a: 2 and b: 3
//= a: 3 and b: 2字符串反向
Q:如何在JavaScript中反转字符串?
A:可以遍历字符串并将字母连接到新字符串。
方法1
function reverse(str){
var rtnStr='';
for(var i= str.length-1; i>=0;i--){
rtnStr+=str[i];
}
return rtnStr;
}
reverse('you are a nice dude');
//="edud ecin a era uoy"Q:你知道在现代浏览器中串联效果很好,但在像IE8这样的旧浏览器中会变慢。还有什么不同的方法,可以扭转一个字符串?
A:当然.我可以使用数组,也可以添加一些检查。如果字符串是NULL或其他字符串,这将失败。让我也做一些类型检查。使用此数组类似于在某些服务器端语言中使用字符串缓冲区。
方法2
function reverse(str){
var rtnStr= [];
if(!str|| typeof str!='string'|| str.length< 2) return str;
for(var i= str.length-1; i>=0;i--){
rtnStr.push(str[i]);
}
return rtnStr.join('');
}Q:运行时间复杂度是多少?
A: O(n);
Q:可以做得更好?
A:我可以遍历索引的一半,它会节省一点点。(这是没用的,可能不会打动面试官)
方法3
function reverse(str){
str= str.split('');
var len= str.length,
halfIndex= Math.floor(len/ 2)- 1,
revStr;
for(var i= 0; i<= halfIndex; i++){
revStr= str[len- i- 1];
str[len- i- 1]= str[i];
str[i]= revStr;
}
return str.join('');
}Q:这有效,但你可以做递归的方式吗?
A:可以。
方法4
function reverse(str){
if(str===""){
return"";
} else{
return reverse(str.substr(1))+ str.charAt(0);
}
}方法5
Q:你可以在方法中使用任何构建,使它更清洁吗?
function reverse(str){
if(!str|| str.length<2) return str;
return str.split('').reverse().join('');
}方法6
Q:你可以做反向函数作为字符串扩展吗?
A:我需要将这个函数添加到String.prototype,而不是使用str作为参数,我需要使用this
String.prototype.reverse= function(){
if(!this|| this.length<2) return this;
return this.split('').reverse().join('');
}
'abc'.reverse();
//='cba'单词反转
Q:你如何在句子中颠倒单词?
A:您必须检查整个字符串的空白区域。确定是否可能有多个空格。
//have a tailing white space
//fix this later
//now i m sleepy
function reverseWords(str){
var rev= [],
wordLen= 0;
for(var i= str.length-1; i>=0; i--){
if(str[i]==''|| i==0){
rev.push(str.substr(i,wordLen+1));
wordLen= 0;
}
else
wordLen++;
}
return rev.join('');
}内置方法的快速解决方案:
function reverseWords(str){
return str.split('').reverse();
}原位反转
Q:如果你有一个字符串如”I am the good boy”,怎样变为“I ma eht doog yob”?注意这些单词位置不变但是被反转了。
A:要做到这一点,我必须做字符串反向和字反转。
function reverseInPlace(str){
return str.split('').reverse().join('').split('').reverse().join('');
}
reverseInPlace('I am the good boy');//="I ma eht doog yob"Q: ok。好的,你能不使用内置反向函数做到吗?
A:(内心独白)有没有搞错!!
//sum two methods.
//you can simply split words by''
//and for each words, call reverse function
//put reverse in a separate function
//if u cant do this,
//have a glass of water, and sleep第一个非重复字符
Q:怎么在字符串中找到第一个非重复字符?
A:有什么条件吗?
A:比如是否区分大小写?
面试官可能会说No。
A:是长字符串还是短字符串?
Q:这些有什么关系吗?
A:例如,如果它是一个非常长的字符串,说一百万个字符,我想检查是否有26个英文字符正在重复。我可能会检查是否所有字符都在每200个字母中重复(例如),而不是循环遍历整个字符串。这将节省计算时间。
Q:简单起见,这个字符串是“the quick brown fox jumps then quickly blow air”。
function firstNonRepeatChar(str){
var len= str.length,
char,
charCount={};
for(var i=0; i<len; i++){
char= str[i];
if(charCount[char]){
charCount[char]++;
}
else
charCount[char]= 1;
}
for(var j in charCount){
if(charCount[j]==1)
return j;
}
}
firstNonRepeatChar('the quick brown fox jumps then quickly blow air');//="f"这有一个问题,不能再循环中及时退出。
删除重复的字符
Q:怎样删除字符串中的重复字符?
A:这与第一个非重复字符非常相似。你应该问一些类似的问题。它是区分大小写的吗?。
如果面试官说,这是区分大小写的,那么你就很轻松了。如果他说不。你可以使用string.toLowercase()来把字符串。面试官可能不喜欢这个方法。因为返回字符串不会拥有相同的大小写。所以
function removeDuplicateChar(str){
var len= str.length,
char,
charCount={},
newStr= [];
for(var i=0; i<len; i++){
char= str[i];
if(charCount[char]){
charCount[char]++;
}
else
charCount[char]= 1;
}
for(var j in charCount){
if(charCount[j]==1)
newStr.push(j);
}
return newStr.join('');
}
removeDuplicateChar('Learn more javascript dude');//="Lnmojvsciptu"回文检查
Q:如何检查一个字符串是否是回文?
A:把字符串反转,如果反转前后相等,那么它就是回文。
function isPalindrome(str){
var i, len= str.length;
for(i=0; i<len/2; i++){
if(str[i]!== str[len-1-i])
return false;
}
return true;
}
isPalindrome('madam')
//= true
isPalindrome('toyota')
//= false或者
function checkPalindrom(str){
return str== str.split('').reverse().join('');
}类似的:在 O(n)时间复杂度内判断一个字符串是否包含在回文字符串内。你能在O(1)时间解决问题吗?
找缺失的数字
Q:在一个1到100的未排序数组中找到缺失的数,你怎么做?
说明:数组中的数字为1到100。数组中只有一个数字缺
js是什么
js等于JavaScript,下面是解释:
JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。
为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。为了统一规格,因为JavaScript兼容于ECMA标准,因此也称为ECMAScript。
外文名:JavaScript
发行时间:1992年
设计者:Brendan Eich
实现者:Netscape、Mozilla基金会
编程范型:脚本语言、基于原型的面向对象
形态系统:动态类型
发源地:美国
组成部分
ECMAScript,描述了该语
javascript组成
言的语法和基本对象。
文档对象模型(DOM),描述处理网页内容的方法和接口。
浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。
基本特点
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
是一种解释性脚本语言(代码不进行预编译)。
主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。
可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。
跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。
Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。
日常用途
嵌入动态文本于HTML页面。
对浏览器事件做出响应。
读写HTML元素。
在数据被提交到服务器之前验证数据。
检测访客的浏览器信息。
控制cookies,包括创建和修改等。
基于Node.js技术进行服务器端编程。
历史
它最初由Netscape的Brendan Eich设计。JavaScript是甲骨文公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型。
Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。JavaScript与Java名称上的近似,是当时Netscape为了营销考虑与Sun微系统达成协议的结果。为了取得技术优势,微软推出了JScript来迎战JavaScript的脚本语言。为了互用性,Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262标准(ECMAScript)。两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。
发展初期,JavaScript的标准并未确定,同期有Netscape的JavaScript,微软的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的工作组确定统一标准:ECMA-262。
上面部分信息来自百度百科
关于js语言基础,js基础语法大全的介绍到此结束,希望对大家有所帮助。